Динамическая инструкция обновления с именами переменных столбцов

Мы хотим сделать обновление в нескольких базах данных SQL Server, чтобы изменить все значения NULL в определенной таблице как пустые строки вместо NULL. Мы потенциально будем делать это через сотни баз данных. Имя таблицы всегда будет одинаковым, но имена столбцов являются переменными на основе того, как настроено внешнее приложение (не судите... я не создал эту систему).

Есть ли способ сделать обновление во всех этих столбцах, не зная имена столбцов раньше времени?

Ответ 1

Вы можете передать имя столбца в динамическом sql:

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

exec sp_executesql @sql;

Ответ 2

Вы можете посмотреть в таблице 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 в качестве основы для обновления.

Ответ 3

Предполагая, что вы хотите, чтобы все столбцы типов 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)

Ответ 4

Это может быть достигнуто с помощью курсоров. Сначала вы выбираете имена столбцов, такие как @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;