Обновите все значения SQL NULL в нескольких столбцах, используя предложение Where уровня столбца?

у нас есть база данных с кучей широких таблиц (40-80 столбцов каждый) и только что нашли ошибку, которая ввела нулевые значения примерно в 500 записей. Значения NULL могут отображаться в любом из столбцов (все целочисленные столбцы, см. рисунок ниже), но эти значения NULL вызывают проблемы с одной из наших систем отчетности, которые не могут быть легко изменены. Нужно заменить значения NULL с определенным статическим значением (в данном случае 99), но так как это изменение должно быть сделано для каждого столбца основа для более чем 250 различных столбцов я бы предпочел не писать отдельные сценарии TSQL, обновляющие каждый столбец по одному.

мой мозг слишком зажаренные прямо сейчас, чтобы придумать умное решение, так мой вопрос как я могу выполнить эту задачу на все столбцы таблицы (или нескольких таблиц), используя простой и читаемый SQL-запрос. Я могу изолировать записи достаточно легко, используя цепочку WHERE (Answer_1 IS NULL) OR (Answer_2 IS NULL) OR ... или даже номерами AdministrationID для каждой таблицы, но этот трюк не будет работать при обновлении как предложение where для строки, а не для столбца. Есть советы?

вот пример запроса показывает несколько записей из 4 таблиц: Sample

4 ответов


к этому нет никакого соглашения - если вы хотите обрабатывать только записи, где соответствующие столбцы равны нулю, вам нужно использовать:

WHERE Answer_1 IS NULL 
   OR Answer_2 IS NULL 
   OR ...

но вы можете использовать это в инструкции UPDATE:

UPDATE YOUR_TABLE
   SET col1 = COALESCE(col1, 99),
       col2 = COALESCE(col2, 99),
       col3 = ...

логика заключается в том, что значение будет обновлено до 99, только если значение столбца равно NULL, из-за того, как работает COALESCE-возврат первого ненулевого значения (обработка списка слева направо).


поскольку вам нужно делать это повсюду, я написал javascript, чтобы помочь вам построить sql. вырезать и вставить это в адресной строке браузера, чтобы получить sql.

javascript:sql='update your table set ';x=0;while(x <= 40){sql += 'answer_'+x+ ' = coalesce(answer_'+x+',99),\n';x++;};alert(sql);

просто опросите sys.столбцы таблицы для каждой таблицы и создать некоторые динамические sql... Это грубая сила, но она избавляет вас от необходимости писать все T-sql.

например:

DECLARE @TABLENAME AS VARCHAR(255)

SET @TABLENAME = 'ReplaceWithYourTableName'

SELECT 'UPDATE ' + @TableName  + ' SET ' + CAST(Name AS VARCHAR(255)) + ' = 99 
 WHERE ' + CAST(Name AS VARCHAR(255)) + ' IS NULL'
FROM sys.columns 
WHERE object_id = OBJECT_ID(@TABLENAME)
    AND system_type_id = 56 -- int's only

Мне не нравится идея манипулировать самими данными с целью отчетности. Если вы измените значения NULL на 99, чтобы сделать вашу отчетность проще, я считаю, что данные повреждены. Что делать, если есть другие потребители, кроме отчетности, которые нуждаются в подлинных данных?

Я бы предпочел написать интеллектуальный запрос для отчета. Например, если вы используете ISNULL (columnname, 99), он будет возвращать 99 всякий раз, когда значение столбца равно NULL.