Обнуление нулевых предупреждений в совокупных функциях в sql
Как использовать отладчик в sql 2008/2012 для улавливания нулевых значений в записях?
См:
drop table abc
create table abc(
a int
)
go
insert into abc values(1)
insert into abc values(null)
insert into abc values(2)
select max(a) from abc
(1 row(s) affected)
Warning: Null value is eliminated by an aggregate or other SET operation.
Теперь это можно выпрямить, выполнив:
SELECT max(isNull(a,0)) FROM abc
что отлично, пока я не перейду к 200 запросам строк с несколькими уровнями вложенности и результирующим набором 2000 нечетных записей. - И тогда не имеет понятия, какой столбец бросает предупреждение.
Как добавить условные точки останова (или прервать предупреждение) в отладчике SQL? (если это возможно)
Ответы
Ответ 1
Часть 1: О совокупных предупреждениях...
Учитывая, что несколько уровней гнездятся, я боюсь, что нет простого способа увидеть, какие записи запускают эти предупреждения.
Я думаю, что ваш лучший снимок будет заключаться в том, чтобы удалить каждую агрегатную функцию по одному за раз из SELECT-части инструкции верхнего уровня и запустить запрос, чтобы вы могли видеть, какой агрегат вызывает предупреждения на верхнем уровне (если есть )
После этого вы должны перейти к вложенным запросам и переместить каждый подзапрос, который передает агрегаты верхнего уровня в отдельное окно и запустить его там, проверить предупреждения. Вы должны повторить это для дополнительных уровней вложенности, чтобы узнать, что на самом деле вызывает предупреждения.
Вы также можете использовать следующий метод.
Часть 2: Об условных контрольных точках...
Для отладки вы перемещаете каждую из вложенных таблиц и помещаете свои данные в временную таблицу. После этого вы проверяете нулевые значения в этой временной таблице. Вы устанавливаете точку останова в инструкции IF. Я считаю, что это лучшее, что близко к условной точке останова. (Предложение IF может быть изменено для создания других условий)
Вот твердый пример,
Вместо этого:
SELECT A.col1, A.col2, SUM(A.col3) as col3
FROM (SELECT X as col1, Y as col2, MAX(Z) as col3
FROM (SELECT A as X, B as Y, MIN(C) as Z
FROM myTableC
) as myTableB
) as myTableA
сделайте следующее:
SELECT A as X, B as Y, MIN(C) as Z
INTO #tempTableC
FROM myTableC
IF EXISTS (SELECT *
FROM #tempTableC
WHERE A IS NULL ) BEGIN
SELECT 'A' --- Breakpoint here
END
SELECT X as col1, Y as col2, MAX(Z) as col3
INTO #tempTableB
FROM #tempTableC
IF EXISTS (SELECT *
FROM #tempTableB
WHERE X IS NULL ) BEGIN
SELECT 'B' --- Breakpoint here
END
SELECT col1, col2, SUM(col3) as col3
FROM #tempTableB as myTableA
Ответ 2
агрегированные функции исключают значения null по определению, поэтому вы можете просто написать
select max (a) from abc
вместо
SELECT max(isNull(a,0)) FROM abc
если все значения a из abc не равны null, в которых второй запрос возвращает ноль вместо null.
Если вы хотите запретить ввод нулевых значений, используйте столбец с нулевым значением.
Ответ 3
Вы можете отключить предупреждение, выполнив:
set ansi_warnings off
Это объясняется здесь. Это работает, по крайней мере, на системах, в которых я тестировал их, чтобы удалить предупреждение при агрегировании по значениям NULL.
Это, предположительно, имеет еще один эффект на преобразование числовых переполнений и деление на 0s на NULL, а не на ошибку. Тем не менее, я все еще получаю ошибки для деления на 0 и арифметические переполнения.
В стороне, при использовании SQL Server Management Studio, редко встречается это сообщение. Когда запрос будет выполнен успешно, сообщение появится на вкладке "Сообщения". Однако SSMS по умолчанию использует вкладку "Результаты", и обычно нет причин смотреть на сообщения (хотя предупреждение есть). Вы видите предупреждение только автоматически, когда в запросе есть ошибка, а SSMS по умолчанию - на вкладке сообщений.
Ответ 4
Вам нужно будет написать второй запрос, чтобы вытащить нужные вам данные.
SELECT * FROM abc WHERE a IS NULL
Вы можете поместить это в оператор IF, чтобы написать сообщение об ошибке или войти в таблицу. Кроме того, вам не повезло. Сожалею.:/
Ответ 5
Скорее вы можете игнорировать наличие строк с нулевыми значениями
SELECT MAX(a) FROM abc WHERE a IS NOT NULL