Sql server Update语句中SQL中的动态列名

Sql server Update语句中SQL中的动态列名,sql-server,sp-executesql,Sql Server,Sp Executesql,当我运行上面的查询时,我得到了无效的列名'@columnName'。。显然,在运行查询时不会替换列名 实际上,我的@sql变量要大得多,我有许多列要更新,因此我希望避免对列名的所有枚举执行SET sql= 我想声明一次sql字符串,然后用不同的值调用查询。e、 g: DECLARE @sql NVARCHAR(max) DECLARE @ParmDefinition NVARCHAR(500) SET @sql = 'UPDATE [Table1] SET [Table1].[@columnNa

当我运行上面的查询时,我得到了
无效的列名'@columnName'。
。显然,在运行查询时不会替换列名


实际上,我的@sql变量要大得多,我有许多列要更新,因此我希望避免对列名的所有枚举执行
SET sql=

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

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';

这样做可能吗?

是的,必须在字符串外部连接变量。换言之:

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
编辑:我们使用的另一个解决方案是替换基本sql中的令牌,以构造新的sql变量来执行

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

您会注意到,SQL2的声明和Exec在这两种情况下都是完全相同的行。这有助于在循环中使用(如果适用)。(除了你不会在循环中声明@Sql2……只需填充/重新填充它即可)。

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

然而,这仍然是可能的;只需将列名与DSQL字符串连接起来,并用quotename函数包装它

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)

我希望能够运行
sp_executesql
并使用不同的值馈送
@columnName
。实际上,我的@sql变量要大得多。我想声明一次sql字符串,然后用不同的值调用查询。好的,我明白你的意思了。您可以尝试Xedni的解决方案,或者我将使用我们过去使用过的另一种解决方案编辑我的答案。如果我有(我有)多个列,我必须
为每个列设置@sql=…
,是吗?是,有条件地。我不知道您到底想完成什么,但理论上,您也可以构建一个包含所有要更新的列的字符串,然后立即运行它。此外,无论是更新行中的单个值,还是更新行中的每一列,SQL都必须做同样多的工作。除非在执行更新时中的列是未知的,否则您可能可以使用静态类型的SQL和isnulls更新表1 set Column1=isnull(@Column1,Column1)Column2,isnull(@Column2,Column2)
set @sql = 'update table1 set table1.' + quotename(@ColumnName) + ' = ...