2012-08-09 391 views
5

我有以下SQL:'CREATE VIEW' 必須在該批次中唯一的語句

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' 必須是隻有在批處理語句

我試圖把GOCreate View之前,但當時它無法識別的PDate值。

+2

你爲什麼要在存儲過程中創建視圖? – 2012-08-09 15:05:33

回答

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; 

但是,一旦你調用這個存儲過程的第二次,它會失敗,因爲你正試圖創建一個名爲dbo.tblList視圖,該視圖已經存在。也許你可以在比「我想在存儲過程中創建視圖」更高級別上詳細說明你想要的內容。

+1

他可以通過說「IF NOT EXISTS(SELECT 1 FROM information_schema.columns WHERE TABLE_NAME ='tblList')BEGIN CREATE VIEW ... END」來避免創建。我試圖做到這一點,但我得到相同的錯誤什麼@NatePet報價。我很需要把整個陳述放到一個字符串中?爲什麼ALTER VIEW的行爲如此? – 2013-07-24 18:12:04

相關問題