"创建视图"必须是批次中唯一的语句

Nat*_*Pet 5 sql-server sql-server-2008-r2

我有以下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 
Run Code Online (Sandbox Code Playgroud)

我收到以下消息:

语法错误:'Create VIEW'必须是批处理中唯一的语句

GO之前尝试过Create View,但后来无法识别它的价值PDate.

Aar*_*and 10

要在存储过程中创建视图,需要在动态SQL中执行此操作(特别是因为视图本身不能接受变量).

DECLARE @sql NVARCHAR(MAX);
SET @sql = 'CREATE VIEW dbo.tblList 
    AS
      SELECT ItemOrder, DisplayVal, 
        SomeAlias = DATEADD(DAY, DaysDue, ''' + CONVERT(CHAR(8), @PDate, 112)
      + ''') FROM dbo.tblLine WHERE ID = 1;';
EXEC sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)

但是一旦你第二次调用这个存储过程,它就会失败,因为你正在尝试创建一个名为的视图,dbo.tblList并且该视图已经存在.也许您可以详细说明您正在尝试的内容,其级别高于"我想在存储过程中创建视图".

  • 他可以通过说“IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE TABLE_NAME = 'tblList') BEGIN CREATE VIEW ... END”来避免创建。我正在尝试这样做,但我得到了同样的错误 @NatePet 引用的内容。我真的需要将整个语句放入一个字符串中吗?为什么 ALTER VIEW 会有这样的行为? (2认同)