简体   繁体   English

从SQL Server 2012中的SP动态创建视图

[英]Create View dynamically from SP in sql server 2012

sql server 2012 SQL Server 2012

i have created a SP to create view dynamically with Parameter i supplied. 我已经创建了一个SP,以使用提供的参数动态创建视图。

below is the code 下面是代码

i am not sure why i am getting the below error. 我不确定为什么会出现以下错误。

Msg 102, Level 15, State 1, Procedure uspCreateView, Line 10 Incorrect syntax near '@VIEWNM'. 消息102,级别15,状态1,过程uspCreateView,第10行'@VIEWNM'附近的语法不正确。

Code: 码:

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'
  )  

please help me to fix the below error. 请帮助我修复以下错误。 Thanks 谢谢

It should be 它应该是
CREATE VIEW ' + @VIEWNM + ' AS... 创建视图'+ @VIEWNM +'AS ...

I am not sure, why you want to create views dynamically, ideally views should be created before hand only, and you will be required to fetch the data depending on the condition. 我不确定,为什么要动态创建视图,理想情况下,视图应该仅在手工创建之前创建,并且需要根据条件来获取数据。

Still if you want to proceed, you should do it proper way to avoid any issues. 不过,如果您要继续进行操作,则应采取正确的方法来避免出现任何问题。 I can see there are issues with your implementation. 我可以看到您的实施存在问题。 Ideally you should make it parameterized, like following sample query to avoid any SQL injection. 理想情况下,应将其参数化,例如以下示例查询,以避免任何SQL注入。

There are issues with your provided code also, I tried to fix some of these. 您提供的代码也存在问题,我尝试修复其中一些问题。

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

Try this 尝试这个

Command(s) completed successfully. 命令已成功完成。

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+'
  )  ')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM