动态 SQL 命令未执行

Dynamic SQL command not getting executed

我需要将一些表转换为临时(系统版本)表。为此,我编写了一个 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'

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

事实上,无论如何你都不能做你想做的事,因为你只能在非动态查询中使用相同的 wsy 中的参数,而这不允许你做 alter tablehttp://www.sommarskog.se/dynamic_sql.html.

您需要构建包括 table 名称的整个字符串,并且不向 sp_executesql.

传递任何参数

您还需要仔细考虑是否要提供如此强大且危险(因为 SQL 注入的危险)程序。