Сомнение в запросе-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 2

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