Обновите все значения 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 таблиц:
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.