2012-08-09 104 views
5

tengo el siguiente código SQL:'CREATE VIEW' debe ser la única instrucción del lote

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 

me sale el siguiente mensaje:

sintaxis incorrecta: 'CREATE VIEW' debe ser el única instrucción del lote

he intentado poner GO antes Create View, pero entonces no puede reconocer el valor de PDate.

+2

¿Por qué está creando vistas en un procedimiento almacenado? –

Respuesta

10

Para crear una vista en un procedimiento almacenado, debe hacer esto en SQL dinámico (especialmente dado que la vista en sí no puede tomar una variable).

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; 

Pero una vez que se llama a este procedimiento almacenado por segunda vez, va a fracasar, ya que están tratando de crear una vista denominada dbo.tblList y que la vista ya existe. Tal vez pueda explicar lo que intenta hacer, en un nivel más alto que "Quiero crear una vista en un procedimiento almacenado".

+1

Pudo evitar la creación diciendo "SI NO EXISTE (SELECCIONA 1 FROM information_schema.columns WHERE TABLE_NAME = 'tblList') COMIENZA CREA VISTA ... END". Estoy tratando de hacer esto, pero obtengo el mismo error. Lo que dice @NatePet. Srsly necesito poner toda la declaración en una cadena? ¿Por qué ALTER VIEW se comporta así? –

Cuestiones relacionadas