Update 语句中 SQL 中的动态列名

Dynamic Column Name in SQL in Update statement

DECLARE @sql NVARCHAR(max)
DECLARE @ParmDefinition NVARCHAR(500)
SET @sql = 'UPDATE [Table1] SET [Table1].[@columnName] = TEST';
SET @ParmDefinition = N'@columnName NVARCHAR(50)';
EXEC sp_executesql @sql, @ParmDefinition, @columnName = N'MyColumn';

当我运行上面的查询时,我得到 Invalid column name '@columnName'.。显然,运行查询时不会替换列名。

实际上,我的@sql 变量要大得多,而且我有很多要更新的列,因此我想避免对列名的所有枚举执行 SET SQL =

我想声明一次 sql 字符串,然后用不同的值调用查询。例如:

EXEC sp_executesql @sql, @ParmDefinition, @columnName = N'MyColumn';
EXEC sp_executesql @sql, @ParmDefinition, @columnName = N'AnotherColumn';
EXEC sp_executesql @sql, @ParmDefinition, @columnName = N'YetAnotherColumn';
-- And so on

这样的事情可能吗?

是的,您必须连接字符串外部的变量。换句话说:

SET @sql = 'UPDATE [Table1] SET [Table1].[' + @columnName + '] = t1.Value ' +

编辑:我们使用的另一种解决方案是替换基数 sql 中的标记以构造一个新的 sql 变量来执行。

DECLARE @sql nvarchar(max) = 'SELECT @ColumnName FROM @TableName';

DECLARE @sql2 nvarchar(max) = REPLACE(REPLACE(@sql,'@ColumnName',@ColumnNameVariable),'@TableName',@TableNameVariable)

EXEC (@sql2)

...Some code that changes the values of @ColumnNameVariable and @TableNameVariable...

DECLARE @sql2 nvarchar(max) = REPLACE(REPLACE(@sql,'@ColumnName',@ColumnNameVariable),'@TableName',@TableNameVariable)

EXEC (@sql2)

你会注意到 SQL2 的 Declaration 和 Exec 在这两种情况下都是完全相同的行。如果适用,这有助于在循环中使用。 (除了你不会在循环中声明@Sql2 ......只是populate/re-populate它)。

首先,感谢您尝试使用 sp_executesql 参数化您的 dsql。问题是,您只能首先参数化可以放入变量的内容,例如在搜索谓词或 select 列表中。

不过还是有可能;只需将列名与您的 DSQL 字符串连接起来,用 quotename 函数将其包装起来

set @sql = 'update table1 set table1.' + quotename(@ColumnName) + ' = ...