sql >> Database teknologi >  >> RDS >> Sqlserver

Få advarsel:Nulværdi elimineres af en samlet eller anden SET-operation

For det meste skal du ikke gøre noget ved det.

  • Det er muligt at deaktivere advarslen ved at indstille ansi_warnings slukket, men dette har andre effekter, f.eks. om, hvordan division med nul håndteres og kan forårsage fejl, når dine forespørgsler bruger funktioner som indekserede visninger, beregnede kolonner eller XML-metoder.
  • I nogle begrænsede tilfælde kan du omskrive aggregatet for at undgå det. for eksempel. COUNT(nullable_column) kan omskrives som SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END) men dette er ikke altid muligt at gøre ligetil uden at ændre semantikken.

Det er blot en informationsmeddelelse, der kræves i SQL-standarden. Udover at tilføje uønsket støj til meddelelsesstrømmen har det ingen skadelige virkninger (udover at det betyder, at SQL Server ikke bare kan omgå læsning af NULL rækker, som kan have en overhead, men at deaktivere advarslen giver ikke bedre udførelsesplaner i denne henseende)

Årsagen til at returnere denne meddelelse er, at de fleste operationer i SQL nuller udbredes.

SELECT NULL + 3 + 7 returnerer NULL (vedrørende NULL som en ukendt mængde giver dette mening som ? + 3 + 7 er også ukendt)

men

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

Returnerer 10 og advarslen om, at nuller blev ignoreret.

Men disse er præcis den semantik, du ønsker til typiske aggregeringsforespørgsler. Ellers tilstedeværelsen af ​​en enkelt NULL ville betyde, at aggregeringer på den kolonne over alle rækker altid ville ende med at give NULL hvilket ikke er særlig nyttigt.

Hvilken er den tungeste kage nedenfor? (Billedkilde, Creative Commons-billede ændret (beskåret og kommenteret) af mig)

Efter den tredje kage var vejet gik vægten i stykker, og der er derfor ingen oplysninger om den fjerde, men det var stadig muligt at måle omkredsen.

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

Forespørgslen

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

Returnerer

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

selvom det teknisk set ikke er muligt at sige med sikkerhed, at 80 var vægten af ​​den tungeste kage (da det ukendte tal kan være større), er resultaterne ovenfor generelt mere nyttige end blot at returnere ukendt.

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

Så sandsynligvis vil du have NULL-værdier til at blive ignoreret, og advarslen advarer dig bare om, at dette sker.



  1. JDBC-forbindelse mislykkedes, fejl:TCP/IP-forbindelse til vært mislykkedes

  2. Opdel værdier over flere rækker

  3. Hvordan bruger man mysql JOIN uden ON-tilstand?

  4. Brug af lagrede procedure-outputparametre i C#