【问题标题】:Dynamic SQL command not getting executed动态 SQL 命令未执行
【发布时间】:2018-11-19 23:09:42
【问题描述】:

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

【问题讨论】:

  • 因为你的两个变量都是空值,这就是它不打印任何东西的原因,我建议你对表、列使用 Quotename() ......小心那里的 SQL 注入。

标签: sql-server dynamic-sql sqlcommand


【解决方案1】:

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

事实上,无论如何你都不能做你想做的事,因为你只能在与非动态查询中相同的 wsy 中使用参数,而这不允许你做alter table 之类的事情@ 987654321@.

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

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

【讨论】:

  • 澄清一下,示例中的问题是@tableName 为空。您是正确的,当以这种方式构造时,OP 无法为动态 sql 声明参数。
猜你喜欢
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
  • 2012-08-25
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多