sql-server - 动态 SQL 命令未执行

标签 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'

最佳答案

它不会打印也不会执行,因为 @tableName@sqlCommand都是nullanything + 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/

相关文章:

sql-server - sql server 有简单的前端吗?

java - 查找从一个表到另一个表的连接路径

sql - 双点表预选赛

sql - 我可以在 SQL Server/TSQL 中回滚动态 SQL

mysql - 为什么我不能执行我的字符串?

postgresql - 为 PostgreSQL 中的记录变量动态传递列名

sql - vb.net sqlclient 插入输出

C# 使用 SqlCommand.Parameters 更新表

sql-server - 在 SQL Server 中使用 DATEDIFF 的最准确方法是什么?

vb.net - dotNet 如何处理编程日期没有时间但 sql 日期有时间的参数化日期