Обновите все значения SQL NULL в нескольких столбцах с помощью предложения Уровень столбца WHERE? - PullRequest
7 голосов
/ 15 октября 2010

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

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

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

Ответы [ 4 ]

21 голосов
/ 15 октября 2010

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

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 - возвращая первое значение, отличное от NULL (обрабатывая список, предоставленный слева направосправа).

4 голосов
/ 15 октября 2010

Так как вы должны делать это повсеместно, я написал несколько 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);
3 голосов
/ 15 октября 2010

Просто опросите таблицу sys.columns для каждой таблицы и создайте некоторый динамический 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
2 голосов
/ 15 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...