[英]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.