Meestal moet je er niets aan doen.
- Het is mogelijk om de waarschuwing uit te schakelen door
ansi_warnings
in te stellen uit, maar dit heeft andere effecten, b.v. over hoe deling door nul wordt afgehandeld en fouten kan veroorzaken wanneer uw zoekopdrachten functies gebruiken zoals geïndexeerde weergaven, berekende kolommen of XML-methoden. - In een beperkt aantal gevallen kunt u het aggregaat herschrijven om het te vermijden. bijv.
COUNT(nullable_column)
kan worden herschreven alsSUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END)
maar dit is niet altijd direct mogelijk zonder de semantiek te veranderen.
Het is slechts een informatief bericht dat vereist is in de SQL-standaard. Afgezien van het toevoegen van ongewenste ruis aan de berichtenstroom, heeft het geen nadelige gevolgen (behalve dat SQL Server het lezen van NULL
niet zomaar kan omzeilen rijen, die een overhead kunnen hebben, maar het uitschakelen van de waarschuwing geeft in dit opzicht geen betere uitvoeringsplannen)
De reden voor het retourneren van dit bericht is dat tijdens de meeste bewerkingen in SQL nulls worden verspreid.
SELECT NULL + 3 + 7
retourneert NULL
(met betrekking tot NULL
als een onbekende hoeveelheid is dit logisch als ? + 3 + 7
is ook onbekend)
maar
SELECT SUM(N)
FROM (VALUES (NULL),
(3),
(7)) V(N)
Retourneert 10
en de waarschuwing dat nulls werden genegeerd.
Dit is echter precies de semantiek die u zoekt voor typische aggregatiequery's. Anders de aanwezigheid van een enkele NULL
zou betekenen dat aggregaties op die kolom over alle rijen altijd resulteren in NULL
wat niet erg handig is.
Wat is de zwaarste cake hieronder? (Afbeeldingsbron, Creative Commons-afbeelding gewijzigd (bijgesneden en geannoteerd) door mij)
Nadat de derde cake was gewogen, brak de weegschaal en dus is er geen informatie beschikbaar over de vierde, maar het was nog steeds mogelijk om de omtrek te meten.
+--------+--------+---------------+
| CakeId | Weight | Circumference |
+--------+--------+---------------+
| 1 | 50 | 12.0 |
| 2 | 80 | 14.2 |
| 3 | 70 | 13.7 |
| 4 | NULL | 13.4 |
+--------+--------+---------------+
De vraag
SELECT MAX(Weight) AS MaxWeight,
AVG(Circumference) AS AvgCircumference
FROM Cakes
Retourneren
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| 80 | 13.325 |
+-----------+------------------+
ook al is het technisch niet mogelijk om met zekerheid te zeggen dat 80 het gewicht was van de zwaarste cake (aangezien het onbekende aantal groter kan zijn), zijn de bovenstaande resultaten over het algemeen nuttiger dan het simpelweg retourneren van onbekend.
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| ? | 13.325 |
+-----------+------------------+
U wilt dus waarschijnlijk dat NULL's worden genegeerd, en de waarschuwing waarschuwt u alleen maar voor het feit dat dit gebeurt.