具有可变列名的动态更新语句
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有可变列名的动态更新语句相关的知识,希望对你有一定的参考价值。
我们希望在多个SQL Server数据库中进行更新,以将某个表中的所有NULL值更改为空字符串而不是NULL。我们可能会在数百个数据库中执行此操作。表名总是相同的,但是列名是根据前端应用程序的配置方式而变化的(不要判断......我没有创建这个系统)。
有没有办法在不知道列名的情况下对所有这些列进行更新?
答案
您可以在动态sql中传递列的名称:
declare @sql nvarchar (1000);
set @sql = N'update table set ' + @column_name + '= ''''';
exec sp_executesql @sql;
另一答案
您可以查看sys.columns
表并加入表名或object_id。
DECLARE @OBJ_ID INT
SELECT @OBJ_ID = OBJECT_ID
FROM SYS.tables
WHERE name = 'YOURTABLE'
SELECT * FROM SYS.columns
WHERE OBJECT_ID = @OBJ_ID
您可以使用sys.columns查询中的name
字段作为执行更新的基础。
另一答案
假设您只想要varchar / char类型的所有列(或者将类型过滤器更改为您需要的任何类型):
DECLARE @tableName varchar(10)
SET @tableName = 'yourtablenamehere'
DECLARE @sql VARCHAR(MAX)
SET @sql = ''
SELECT @sql = @sql + 'UPDATE ' + @tableName + ' SET ' + c.name + ' = '''' WHERE ' + c.name + ' IS NULL ;'
FROM sys.columns c
INNER JOIN sys.tables t ON c.object_id = t.object_id
INNER JOIN sys.types y ON c.system_type_id = y.system_type_id
WHERE t.name = @tableName AND y.name IN ('varchar', 'nvarchar', 'char', 'nchar')
EXEC (@sql)
另一答案
这可以通过游标实现。首先选择像@Darren提到的列名,然后使用这些值设置光标并循环:
Open oColumnsCursor
Fetch Next From oColumnscursor
Into @ColumnName
While @@FETCH_STATUS=0
Begin
Set @oQuery = 'Update [DB]..[Table] Set [' + @ColumnName + '] = ''NewValue'' Where [' + @ColumnName + '] = ''OldValue'''
Execute(@oQuery)
Fetch Next From oColumnscursor Into @ColumnName
Set @oCount = @oCount + 1
End
Close oColumnsCursor;
Deallocate oColumnsCursor;
以上是关于具有可变列名的动态更新语句的主要内容,如果未能解决你的问题,请参考以下文章
Oracle PL/SQL - 循环值作为没有动态 SQL 的动态列名