在sql server 2012中从SP动态创建View

时间:2018-03-12 09:00:44

标签: sql sql-server

sql server 2012

我创建了一个SP来动态创建视图,并提供参数i。

下面是代码

我不知道为什么我会收到以下错误。

消息102,级别15,状态1,过程uspCreateView,第10行 “@VIEWNM”附近的语法不正确。

代码:

CREATE PROCEDURE uspCreateView
@VIEWNM VARCHAR(50),
@COMP INT,
@TODT DATE = 9999-12-31


    AS
    EXEC ('

    CREATE VIEW +'@VIEWNM'
    AS
(
SELECT
COL1,
COL2,
COL3,   
DATE,   
SKU,    
CASE WHEN IsRowCurrent = 1 THEN '@TODT' ELSE dateadd(MILLISECOND, -1000 - datepart(MILLISECOND, FMDT), FMDT) END AS TODT,

FROM MYTABLE mt


OUTER APPLY (   SELECT  MAX(DATEADD(second, -1, FMDT)) TO_DATE 
                        FROM    MYTABLE mt2 
                        WHERE   mt2.COL1 = mt.COL1 
                                AND mt2.COL2 = mt.COL2 
                                AND mt2.FMDT > mt.FMDT
                                AND mt.COL3 = '@COMPID'  ) oa
  WHERE mt.COL3 = '@COMPID'
  )  

请帮我解决以下错误。 感谢

3 个答案:

答案 0 :(得分:0)

应该是
    创建视图' + @VIEWNM +' AS ...

答案 1 :(得分:0)

我不确定,为什么要动态创建视图,理想情况下应该只在创建视图之前创建视图,并且需要根据条件获取数据。

如果你想继续,你应该采取正确的方法来避免任何问题。我可以看到您的实施存在问题。理想情况下,您应该对其进行参数化,如下面的示例查询以避免任何SQL注入。

您提供的代码也存在问题,我尝试修复其中一些。

CREATE PROCEDURE uspCreateView 
    (
      @VIEWNM      VARCHAR(50), 
      @COMP        INT, 
      @TODT        DATE = '9999-12-31' 
      )
    AS
    BEGIN
     DECLARE @Query NVARCHAR(MAX) 
     DECLARE @ParmDefinition nvarchar(MAX);  
    SET @Query = N'CREATE VIEW @VIEWNM_I     AS ( SELECT COL1, COL2, COL3, DATE, SKU, 
        CASE WHEN IsRowCurrent = 1 THEN @TODT_I ELSE 
        dateadd(MILLISECOND, -1000 - datepart(MILLISECOND, FMDT)
        , FMDT) END AS TODT, FROM MYTABLE mt OUTER APPLY (   
        SELECT  MAX(DATEADD(second, -1, FMDT)) TO_DATE                         
        FROM    MYTABLE mt2                         
        WHERE   mt2.COL1 = mt.COL1                                 
        AND mt2.COL2 = mt.COL2                                 
        AND mt2.FMDT > mt.FMDT                                 
        AND mt.COL3 = @COMPID_I  ) oa  
        WHERE mt.COL3 = @COMPID_I)' 
    SET @ParmDefinition = N'@VIEWNM VARCHAR(100),@TODT_I DATETIME,@COMP_I INT';  
    EXECUTE sp_executesql @Query,@ParmDefinition, @VIEWNM_I=@VIEWNM,  @COMP_I=@COMP, @TODT_I=@TODT
    END

答案 2 :(得分:0)

试试这个

命令已成功完成。

CREATE PROCEDURE uspCreateView
@VIEWNM VARCHAR(50),
@COMP INT,
@TODT DATE = '9999-12-31'


    AS
    EXEC ('

    CREATE VIEW '+@VIEWNM+'
    AS
(
SELECT
COL1,
COL2,
COL3,   
DATE,   
SKU,    
CASE WHEN IsRowCurrent = 1 THEN '+@TODT+' ELSE dateadd(MILLISECOND, -1000 - datepart(MILLISECOND, FMDT), FMDT) END AS TODT,

FROM MYTABLE mt


OUTER APPLY (   SELECT  MAX(DATEADD(second, -1, FMDT)) TO_DATE 
                        FROM    MYTABLE mt2 
                        WHERE   mt2.COL1 = mt.COL1 
                                AND mt2.COL2 = mt.COL2 
                                AND mt2.FMDT > mt.FMDT
                                AND mt.COL3 = '+@COMP+'  ) oa
  WHERE mt.COL3 = '+@COMP+'
  )  ')