我需要将一些表转换为临时(系统版本)表。为此,我编写了一个以动态方式执行的 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
都是null
和anything + null = null
在 T-SQL 中,因此它们仍然是 null
.
事实上,无论如何你都不能做你想做的事情,因为你只能在同一个 wsy 中使用参数,就像在非动态查询中一样,这不允许你做像 alter table
这样的事情。请参阅http://www.sommarskog.se/dynamic_sql.html .
您需要构建包括表名的整个字符串,并且不将任何参数传递到 sp_executesql
.
您还需要仔细考虑是否要提供如此强大且危险(因为 SQL 注入(inject)的危险)的过程。
关于sql-server - 动态 SQL 命令未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53383951/