Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warnung erhalten:Nullwert wird durch eine Aggregat- oder andere SET-Operation eliminiert

Meistens sollten Sie nichts dagegen tun.

  • Es ist möglich, die Warnung zu deaktivieren, indem Sie ansi_warnings setzen aus, aber dies hat andere Auswirkungen, z. wie die Division durch Null gehandhabt wird und Fehler verursachen kann, wenn Ihre Abfragen Funktionen wie indizierte Ansichten, berechnete Spalten oder XML-Methoden verwenden.
  • In einigen begrenzten Fällen können Sie das Aggregat umschreiben, um dies zu vermeiden. z.B. COUNT(nullable_column) kann umgeschrieben werden als SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END) aber das ist nicht immer direkt möglich, ohne die Semantik zu ändern.

Es ist nur eine Informationsnachricht, die im SQL-Standard erforderlich ist. Abgesehen davon, dass dem Nachrichtenstrom unerwünschtes Rauschen hinzugefügt wird, hat es keine negativen Auswirkungen (außer dass SQL Server das Lesen von NULL nicht einfach umgehen kann Zeilen, die einen Overhead haben können, aber das Deaktivieren der Warnung führt in dieser Hinsicht nicht zu besseren Ausführungsplänen)

Der Grund für die Rückgabe dieser Nachricht ist, dass bei den meisten Operationen in SQL Nullen weitergegeben werden.

SELECT NULL + 3 + 7 gibt NULL zurück (bezüglich NULL als unbekannte Größe macht das Sinn als ? + 3 + 7 ist ebenfalls unbekannt)

aber

SELECT SUM(N)
FROM   (VALUES (NULL),
               (3),
               (7)) V(N) 

Gibt 10 zurück und die Warnung, dass Nullen ignoriert wurden.

Dies ist jedoch genau die gewünschte Semantik für typische Aggregationsabfragen. Andernfalls das Vorhandensein eines einzelnen NULL würde bedeuten, dass Aggregationen in dieser Spalte über alle Zeilen hinweg immer NULL ergeben würden was nicht sehr nützlich ist.

Welches ist der schwerste Kuchen unten? (Bildquelle, Creative Commons-Bild von mir geändert (beschnitten und kommentiert))

Nach dem Wiegen des dritten Kuchens ist die Waage kaputt gegangen, so dass über den vierten keine Information mehr verfügbar ist, aber der Umfang konnte noch gemessen werden.

+--------+--------+---------------+
| CakeId | Weight | Circumference |
+--------+--------+---------------+
|      1 | 50     | 12.0          |
|      2 | 80     | 14.2          |
|      3 | 70     | 13.7          |
|      4 | NULL   | 13.4          |
+--------+--------+---------------+

Die Abfrage

SELECT MAX(Weight)        AS MaxWeight,
       AVG(Circumference) AS AvgCircumference
FROM   Cakes 

Rückgabe

+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
|        80 |          13.325  |
+-----------+------------------+

Obwohl es technisch nicht möglich ist, mit Sicherheit zu sagen, dass 80 das Gewicht des schwersten Kuchens war (da die unbekannte Zahl größer sein kann), sind die obigen Ergebnisse im Allgemeinen nützlicher, als einfach unbekannt zurückzugeben.

+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
|         ? |          13.325  |
+-----------+------------------+

Wahrscheinlich möchten Sie, dass NULL-Werte ignoriert werden, und die Warnung macht Sie nur darauf aufmerksam, dass dies geschieht.