Сомнение в запросе-SQL Server 2005
У меня есть таблица со 100 столбцами. здесь до 50-60 столбцов содержат в себе нулевое значение. Теперь мне нужно заменить это нулевое значение на 0 во всех 50-60 столбцах. Я попытался с помощью запроса обновления as,
UPDATE [tableName]
SET col1=0, col2 = 0, ... col60 = 0
WHERE col1 IS NULL AND Col2 IS NULL ... Col60 IS NULL
Есть ли другой запрос для обновления этих всех 60 столбцов без указания таких столбцов, или у нас есть какой-либо другой подход???
4 ответа:
Вы должны указать все столбцы, но вы можете пропустить предложение WHERE и иметь одно обновление, связанное со всеми сразу:
UPDATE [tableName] SET col1=COALESCE(col1, 0), col2=COALESCE(col2, 0), col3=COALESCE(col3, 0), col4=COALESCE(col4, 0), [...]
Вы можете попробовать этот обходной путь, если каждое значение в Столбцах равно NULL:
- отредактируйте определение таблицы и установите столбцы как "вычисленные" и используйте 0 в качестве Формулы
- сохраните таблицу
- Удалить Формулу
Это не очень элегантно, но работает
Я не думаю, что есть альтернатива - но запрос, который вы разместили, обновит только записи, где все столбцы равны нулю.
Если вы хотите обновить отдельные столбцы, вам нужно разбить его на отдельные обновления:
update table set col1 = 0 where col 1 is null update table set col2 = 0 where col2 is null
Чтобы не писать этот запрос вручную, вы можете сгенерировать его с помощью динамического SQL:
DECLARE @Table NVARCHAR(255)= 'Your table' DECLARE @sSQl NVARCHAR(MAX)= 'UPDATE ' + @Table + ' SET ' + CHAR(13) ; WITH c AS ( SELECT c.name FROM sys.all_columns c JOIN sys.tables T ON c.object_id = T.object_id WHERE t.name = @Table ) SELECT @sSQl = @sSQl + c.name + '=ISNULL(' + c.name + ',0)' + ',' + CHAR(13) FROM c IF LEN(@sSQl) > 0 SET @ssql = LEFT(@sSQl, LEN(@sSQl) - 2) PRINT @ssql