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'
)
请帮我解决以下错误。 感谢
答案 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+'
) ')