Обнуление нулевых предупреждений в совокупных функциях в sql - программирование

Обнуление нулевых предупреждений в совокупных функциях в 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? (если это возможно)

4b9b3361

Ответ 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