动态 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 中都是 null
和 anything + null = null
所以它们仍然是 null
.
事实上,无论如何你都不能做你想做的事,因为你只能在非动态查询中使用相同的 wsy 中的参数,而这不允许你做 alter table
见 http://www.sommarskog.se/dynamic_sql.html.
您需要构建包括 table 名称的整个字符串,并且不向 sp_executesql
.
传递任何参数
您还需要仔细考虑是否要提供如此强大且危险(因为 SQL 注入的危险)程序。
我需要将一些表转换为临时(系统版本)表。为此,我编写了一个 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 中都是 null
和 anything + null = null
所以它们仍然是 null
.
事实上,无论如何你都不能做你想做的事,因为你只能在非动态查询中使用相同的 wsy 中的参数,而这不允许你做 alter table
见 http://www.sommarskog.se/dynamic_sql.html.
您需要构建包括 table 名称的整个字符串,并且不向 sp_executesql
.
您还需要仔细考虑是否要提供如此强大且危险(因为 SQL 注入的危险)程序。