Оператор динамического обновления с именами столбцов переменных

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

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

Ответы на вопрос(4)

что вы хотите, чтобы все столбцы были только для типов 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;
Решение Вопроса

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

exec sp_executesql @sql;
 CaptainMarvel08 сент. 2016 г., 15:50
@GSerg +1 за упоминаниеquotename(), Я скажу, что его использование здесь кажется немного излишним, учитывая, что это было только для некоторого внутреннего DML. Если это был sproc, который должен быть выполнен с пользовательским вводом с публичного (или адского, даже внутреннего) сайта, стоящего лицом к лицу, я 'буду все в.
 GSerg08 сент. 2015 г., 20:51
пожалуйставсегда использоватьquotename вокруг динамических имен объектов.

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

Ваш ответ на вопрос