我们正在寻找在多个SQL Server数据库中进行更新,以将某个表中的所有NULL值更改为空字符串而非NULL。我们可能会在数百个数据库中这样做。表名将始终相同,但根据前端应用程序的配置方式,列名是可变的(不要判断......我没有创建此系统)。带有可变列名称的动态更新语句
有没有办法在不知道列名的情况下对所有这些列进行更新?
我们正在寻找在多个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
您可以使用name
字段从SYS.COLUMNS查询,以此为基础进行的更新。
假设你想只为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)
请[总是使用'quotename'](http://stackoverflow.com/a/6285111/11683)围绕动态对象名称。 – GSerg
@GSerg +1提到'quotename()'。我会说它在这里的使用似乎有点多余,因为这只是一些内部的DML。如果这是一个在公众(或地狱,甚至内部)面对网站的用户输入时执行的sproc,我会全身心投入。 – CaptainMarvel