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 alsSUM(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.