Update语句中SQL中的动态列名称

时间:2015-01-08 22:50:28

标签: sql-server sp-executesql

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字符串一次,并使用不同的值调用查询。 e.g:

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

这样的事情可能吗?

2 个答案:

答案 0 :(得分:4)

是的,你必须在字符串之外连接变量。换句话说:

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的声明和执行在两种情况下完全相同。如果适用,这有助于在LOOP中使用。 (除非你不会在循环中DECLARE @ Sql2 ...只是填充/重新填充它。)

答案 1 :(得分:3)

首先,尝试使用sp_executesql参数化您的dsql的荣誉。问题是,你只能参数化你可以放在变量中的东西,比如在搜索谓词或选择列表中。

然而,它仍然可能;只需将列名与DSQL字符串连接起来,并使用引号函数

将其包装起来
set @sql = 'update table1 set table1.' + quotename(@ColumnName) + ' = ...