En general, no debes hacer nada al respecto.
- Es posible deshabilitar la advertencia configurando
ansi_warnings
apagado pero esto tiene otros efectos, p. sobre cómo se maneja la división por cero y cómo puede causar fallas cuando sus consultas usan funciones como vistas indexadas, columnas calculadas o métodos XML. - En algunos casos limitados, puede volver a escribir el agregado para evitarlo. p.ej.
COUNT(nullable_column)
se puede reescribir comoSUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END)
pero esto no siempre es posible de hacer directamente sin cambiar la semántica.
Es solo un mensaje informativo requerido en el estándar SQL. Además de agregar ruido no deseado al flujo de mensajes, no tiene efectos negativos (aparte de que SQL Server no puede simplemente pasar por alto la lectura de NULL
filas, que pueden tener una sobrecarga pero deshabilitar la advertencia no brinda mejores planes de ejecución a este respecto)
La razón para devolver este mensaje es que en la mayoría de las operaciones en SQL se propagan nulos.
SELECT NULL + 3 + 7
devuelve NULL
(con respecto a NULL
como una cantidad desconocida esto tiene sentido como ? + 3 + 7
también se desconoce)
pero
SELECT SUM(N)
FROM (VALUES (NULL),
(3),
(7)) V(N)
Devuelve 10
y la advertencia de que se ignoraron los nulos.
Sin embargo, estas son exactamente la semántica que desea para consultas de agregación típicas. De lo contrario, la presencia de un solo NULL
significaría que las agregaciones en esa columna en todas las filas siempre terminarían produciendo NULL
lo cual no es muy útil.
¿Cuál es el pastel más pesado a continuación? (Fuente de la imagen, imagen de Creative Commons alterada (recortada y anotada) por mí)
Después de pesar el tercer pastel, la balanza se rompió, por lo que no hay información disponible sobre el cuarto, pero aún fue posible medir la circunferencia.
+--------+--------+---------------+
| CakeId | Weight | Circumference |
+--------+--------+---------------+
| 1 | 50 | 12.0 |
| 2 | 80 | 14.2 |
| 3 | 70 | 13.7 |
| 4 | NULL | 13.4 |
+--------+--------+---------------+
La consulta
SELECT MAX(Weight) AS MaxWeight,
AVG(Circumference) AS AvgCircumference
FROM Cakes
Devoluciones
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| 80 | 13.325 |
+-----------+------------------+
aunque técnicamente no es posible decir con certeza que 80 fue el peso del pastel más pesado (ya que el número desconocido puede ser mayor), los resultados anteriores son generalmente más útiles que simplemente devolver un valor desconocido.
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| ? | 13.325 |
+-----------+------------------+
Es muy probable que desee que se ignoren los valores NULL, y la advertencia solo lo alerta sobre el hecho de que esto está sucediendo.