‘Create VIEW’必须是批处理中唯一的语句

问题描述 投票:0回答:1

我有以下 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-server sql-server-2008-r2
1个回答
11
投票

要在存储过程中创建视图,您需要在动态 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 ...

...并且不必担心它是否已经存在(您只需要担心是否不小心替换了恰好具有相同名称的非常不同的视图)。

© www.soinside.com 2019 - 2024. All rights reserved.