具有可变列名称的dynamic更新语句

我们希望在多个SQL Server数据库中进行更新,将某个表中的所有NULL值更改为空string而不是NULL。 我们可能会在数百个数据库上做这件事。 表名将始终相同,但根据前端应用程序的configuration,列名是可变的(不要判断…我没有创build这个系统)。

是否有办法在不知道列名的情况下对所有这些列进行更新?

您可以在dynamicsql中传递列的名称:

declare @sql nvarchar (1000); set @sql = N'update table set ' + @column_name + '= '''''; exec sp_executesql @sql; 

您可以查看sys.columns表并join表名或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 / chartypes的所有列(或者将typesfilter改为任何你需要的):

 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)