我有以下 SQL:
ALTER PROCEDURE [dbo].[usp_gettasks]
@ID varchar(50)
AS
declare @PDate Date
WHILE (DATEPART(DW, @PDate) = 1 OR DATEPART(DW, @PDate) = 7 )
BEGIN
set @PDate = DATEADD(day, 1, @PDate)
END
CREATE VIEW tblList AS
select tt.ItemOrder,tt.DisplayVal, DATEADD(day, tt.DaysDue, @PDate) from tblLine tt
where tt.ID = 1
我收到以下消息:
语法错误:“Create VIEW”必须是批处理中的唯一语句
我尝试将
GO
放在Create View
之前,但是它无法识别PDate
的值。
要在存储过程中创建视图,您需要在动态 SQL 中执行此操作(特别是因为视图本身不能接受变量)。这是因为模块无法作为较大脚本的一部分创建(就像有条件逻辑时所需的脚本,如
IF <some condition> CREATE VIEW
)。
DECLARE @sql nvarchar(max) = N'CREATE VIEW dbo.tblList
AS
SELECT ItemOrder, DisplayVal,
SomeAlias = DATEADD(DAY, DaysDue, '''
+ CONVERT(char(8), @PDate, 112)
+ N''') FROM dbo.tblLine WHERE ID = 1;';
EXEC sys.sp_executesql @sql;
但是一旦你第二次调用这个存储过程,它就会失败,因为你试图创建一个名为
dbo.tblList
的视图,并且该视图已经存在。也许您可以在比“我想在存储过程中创建视图”更高的级别上详细说明您正在尝试的内容。
当然,在现代版本中,你可以直接说:
CREATE OR ALTER VIEW ...
...并且不必担心它是否已经存在(您只需要担心是否不小心替换了恰好具有相同名称的非常不同的视图)。