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 的声明和执行在这两种情况下都是完全相同的行。 如果适用,这适合在 LOOP 中使用。 (除了你不会在循环中声明@Sql2...只需填充/重新填充它)。
首先,尝试使用 sp_executesql 参数化 dsql 表示赞赏。问题是,您只能参数化可以首先放入变量中的内容,例如在搜索谓词或选择列表中。
但是,这仍然是可能的;只需将列名与DSQL字符串连接起来,用引号函数包装它
set @sql = 'update table1 set table1.' + quotename(@ColumnName) + ' = ...