动态SQL命令未执行

时间:2018-11-19 23:09:43

标签: sql-server dynamic-sql sqlcommand

我需要将某些表转换为临时表(系统版本)。为此,我编写了一个以动态方式执行的SQL命令。

查询不会引发错误,但是不会执行SQL命令。它也不使用“ PRINT”打印命令。

我阅读了SO中的相关文章。根据他们的说法,我在脚本中声明了变量,并为其提供了“ sp_executesql”。请告知。

DECLARE @sqlCommand nvarchar(2000)
DECLARE @tableName nvarchar(100)


SET @sqlCommand =
'ALTER TABLE ' + @tableName + '
ADD [SysStartTime] DATETIME2
GO

ALTER TABLE ' + @tableName + '
ADD [SysEndTime] DATETIME2
GO

UPDATE ' + @tableName + ' SET [SysStartTime] = ''19000101 00:00:00.0000000'', [SysEndTime] = ''99991231 23:59:59.9999999''
GO

ALTER TABLE ' + @tableName + '
ALTER COLUMN [SysStartTime] DATETIME2 NOT NULL
GO

ALTER TABLE ' + @tableName + '
ALTER COLUMN [SysEndTime] DATETIME2 NOT NULL
GO

ALTER TABLE ' + @tableName + '
ADD PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])

ALTER TABLE ' + @tableName + ' SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [History].ConditionAssessment))
GO'

PRINT @sqlCommand 


EXECUTE sp_executesql @sqlCommand, N'@tableName nvarchar(100)', @tableName = 'ConditionAssessmentData'

1 个答案:

答案 0 :(得分:3)

它不会打印也不执行,因为@tableName@sqlCommand在T-SQL中都是nullanything + null = null,因此它们仍然是null

实际上,您无论如何都无法做您想做的事情,因为您只能以与非动态查询相同的方式使用参数,并且不能让您执行alter table之类的操作参见http://www.sommarskog.se/dynamic_sql.html

您将需要构建包括表名在内的整个字符串,并且不将任何参数传递到sp_executesql中。

您还需要仔细考虑是否要提供这样一个功能强大且危险(由于SQL注入的危险)的过程。