4
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

这样的事情可能吗?

4

2 回答 2

5

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

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

于 2015-01-08T22:53:01.140 回答
3

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

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

set @sql = 'update table1 set table1.' + quotename(@ColumnName) + ' = ...
于 2015-01-08T22:54:34.680 回答