Обикновено не трябва да правите нищо по въпроса.
- Възможно е да деактивирате предупреждението, като зададете
ansi_warnings
изключен, но това има други ефекти, напр. за това как се обработва разделението на нула и може да причини неуспехи, когато вашите заявки използват функции като индексирани изгледи, изчислени колони или XML методи. - В някои ограничени случаи можете да пренапишете агрегата, за да го избегнете. напр.
COUNT(nullable_column)
може да бъде пренаписано катоSUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END)
но това не винаги е възможно да се направи направо, без да се променя семантиката.
Това е просто информационно съобщение, което се изисква в стандарта SQL. Освен добавянето на нежелан шум към потока от съобщения, той няма лоши ефекти (освен това, че SQL Server не може просто да заобиколи четенето на NULL
редове, които могат да имат допълнителни разходи, но деактивирането на предупреждението не дава по-добри планове за изпълнение в това отношение)
Причината за връщането на това съобщение е, че по време на повечето операции в SQL се разпространяват нули.
SELECT NULL + 3 + 7
връща NULL
(относно NULL
като неизвестно количество това има смисъл като ? + 3 + 7
също е неизвестен)
но
SELECT SUM(N)
FROM (VALUES (NULL),
(3),
(7)) V(N)
Връща 10
и предупреждението, че нулевите стойности са игнорирани.
Това обаче е точно семантиката, която искате за типични заявки за агрегиране. В противен случай наличието на единичен NULL
би означавало агрегирането на тази колона върху всички редове винаги ще доведе до NULL
което не е много полезно.
Коя е най-тежката торта по-долу? (Източник на изображение, изображение на Creative Commons, променено (изрязано и анотирано) от мен)
След претеглянето на третата торта везната се счупи и така няма налична информация за четвъртата, но все още беше възможно да се измери обиколката.
+--------+--------+---------------+
| CakeId | Weight | Circumference |
+--------+--------+---------------+
| 1 | 50 | 12.0 |
| 2 | 80 | 14.2 |
| 3 | 70 | 13.7 |
| 4 | NULL | 13.4 |
+--------+--------+---------------+
Запитването
SELECT MAX(Weight) AS MaxWeight,
AVG(Circumference) AS AvgCircumference
FROM Cakes
Връща
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| 80 | 13.325 |
+-----------+------------------+
въпреки че технически не е възможно да се каже със сигурност, че 80 е било теглото на най-тежката торта (тъй като неизвестното число може да е по-голямо), резултатите по-горе обикновено са по-полезни от просто връщане на неизвестно.
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| ? | 13.325 |
+-----------+------------------+
Така че вероятно искате NULL да бъдат игнорирани, а предупреждението просто ви предупреждава за факта, че това се случва.