Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Получаване на предупреждение:Нулевата стойност се елиминира чрез агрегат или друга операция SET

Обикновено не трябва да правите нищо по въпроса.

  • Възможно е да деактивирате предупреждението, като зададете 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 да бъдат игнорирани, а предупреждението просто ви предупреждава за факта, че това се случва.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLException :низови или двоични данни ще бъдат съкратени

  2. Как да върнете подниз от низ в SQL Server с помощта на функцията SUBSTRING().

  3. Ръководство за CTE в SQL Server

  4. Включете липсващите месеци в заявката за група по

  5. Присъединяването на множество таблици връща стойност NULL