2012-08-09 13 views
5

Ich habe die folgende SQL:'Create VIEW' muss die einzige Anweisung im Batch seiner

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 

ich die folgende Meldung:

falsche Syntax: 'Create VIEW' das sein muss, nur Anweisung im Batch

ich versuchte GO vor Create View setzen, aber dann kann es nicht den Wert von PDate erkennen.

+2

Warum erstellen Sie Ansichten in einer gespeicherten Prozedur? –

Antwort

10

Um eine Ansicht in einer Stored Procedure zu erstellen, müssen Sie dies in Dynamic SQL tun (insbesondere da die View selbst keine Variable annehmen kann).

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; 

Aber sobald Sie diese gespeicherte Prozedur ein zweites Mal aufrufen, es wird scheitern, weil Sie versuchen, eine Ansicht dbo.tblList und diese Ansicht bereits vorhanden Namen zu erstellen. Vielleicht können Sie auf einer höheren Ebene als "Ich möchte eine Ansicht in einer gespeicherten Prozedur erstellen" näher erläutern, was Sie versuchen.

+1

Er könnte die Erstellung vermeiden, indem er sagt: "IF NOT EXISTS (SELECT 1 VON information_schema.columns WHERE TABLE_NAME = 'tblList') BEGIN CREATE VIEW ... END". Ich versuche, dies zu tun, aber ich bekomme den gleichen Fehler, was @NatePet zitiert. Muss ich die ganze Aussage in eine Zeichenkette stecken? Warum verhält sich ALTER VIEW so? –