Surtout, vous ne devriez rien faire à ce sujet.
- Il est possible de désactiver l'avertissement en définissant
ansi_warnings
off mais cela a d'autres effets, par ex. sur la façon dont la division par zéro est gérée et peut entraîner des échecs lorsque vos requêtes utilisent des fonctionnalités telles que des vues indexées, des colonnes calculées ou des méthodes XML. - Dans certains cas limités, vous pouvez réécrire l'agrégat pour l'éviter. par exemple.
COUNT(nullable_column)
peut être réécrit sous la formeSUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END)
mais ce n'est pas toujours possible de le faire directement sans changer la sémantique.
C'est juste un message d'information requis dans la norme SQL. En plus d'ajouter du bruit indésirable au flux de messages, cela n'a aucun effet néfaste (à part le fait que SQL Server ne peut pas simplement contourner la lecture de NULL
lignes, qui peuvent avoir une surcharge mais la désactivation de l'avertissement ne donne pas de meilleurs plans d'exécution à cet égard)
La raison pour laquelle ce message est renvoyé est que, dans la plupart des opérations en SQL, les valeurs nulles se propagent.
SELECT NULL + 3 + 7
renvoie NULL
(concernant NULL
en tant que quantité inconnue, cela a du sens en tant que ? + 3 + 7
est également inconnu)
mais
SELECT SUM(N)
FROM (VALUES (NULL),
(3),
(7)) V(N)
Renvoie 10
et l'avertissement indiquant que les valeurs nulles ont été ignorées.
Cependant, ce sont exactement la sémantique que vous souhaitez pour les requêtes d'agrégation typiques. Sinon la présence d'un seul NULL
signifierait que les agrégations sur cette colonne sur toutes les lignes finiraient toujours par donner NULL
ce qui n'est pas très utile.
Quel est le gâteau le plus lourd ci-dessous ? (Source de l'image, image Creative Commons modifiée (recadrée et annotée) par moi)
Après la pesée du troisième gâteau, la balance s'est cassée et aucune information n'est donc disponible sur le quatrième mais il était toujours possible de mesurer la circonférence.
+--------+--------+---------------+
| CakeId | Weight | Circumference |
+--------+--------+---------------+
| 1 | 50 | 12.0 |
| 2 | 80 | 14.2 |
| 3 | 70 | 13.7 |
| 4 | NULL | 13.4 |
+--------+--------+---------------+
La requête
SELECT MAX(Weight) AS MaxWeight,
AVG(Circumference) AS AvgCircumference
FROM Cakes
Retours
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| 80 | 13.325 |
+-----------+------------------+
même si techniquement il n'est pas possible de dire avec certitude que 80 était le poids du gâteau le plus lourd (car le nombre inconnu peut être plus grand), les résultats ci-dessus sont généralement plus utiles que de simplement renvoyer inconnu.
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| ? | 13.325 |
+-----------+------------------+
Il est donc probable que vous souhaitiez que les valeurs NULL soient ignorées, et l'avertissement vous avertit simplement du fait que cela se produit.