大多数情况下你不应该对此采取任何行动。
- 可以通过设置禁用警告
ansi_warnings
关闭但这有其他影响,例如关于如何处理除零 https://learn.microsoft.com/en-us/sql/t-sql/statements/set-ansi-warnings-transact-sql?view=sql-server-ver15当您的查询使用索引视图、计算列或 XML 方法等功能时,可能会导致失败。
- 在某些有限的情况下,您可以重写聚合来避免这种情况。例如
COUNT(nullable_column)
可以重写为SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END)
但这并不总是可以在不改变语义的情况下直接完成。
这只是一条信息性消息SQL标准中要求的 https://dba.stackexchange.com/questions/10952/meaning-of-set-in-error-message-null-value-is-eliminated-by-an-aggregate-or-o/18454#18454。除了向消息流添加不需要的噪音之外,它没有任何不良影响(除了意味着 SQL Server 不能绕过读取NULL
行,其中可以有开销 https://feedback.azure.com/forums/908035-sql-server/suggestions/40496701-scalargbaggtotop-transformation-with-max-nullable但禁用警告并不能在这方面提供更好的执行计划)
返回此消息的原因是 SQL 空值在大多数操作中传播。
SELECT NULL + 3 + 7
回报NULL
(关于NULL
作为一个未知量,这是有道理的? + 3 + 7
亦未知)
but
SELECT SUM(N)
FROM (VALUES (NULL),
(3),
(7)) V(N)
Returns 10
以及空值被忽略的警告。
然而这些都是正是你想要的语义对于典型的聚合查询。否则单个的存在NULL
意味着该列对所有行的聚合最终总是会产生结果NULL
这不是很有用。
下面哪个蛋糕最重? (图片来源 https://www.flickr.com/photos/8514720@N04/6862029495/, 创作共用 https://creativecommons.org/licenses/by/2.0/图像由我修改(裁剪和注释))
在对第三块蛋糕进行称重后,秤破裂了,因此没有关于第四块蛋糕的信息,但仍然可以测量周长。
+--------+--------+---------------+
| CakeId | Weight | Circumference |
+--------+--------+---------------+
| 1 | 50 | 12.0 |
| 2 | 80 | 14.2 |
| 3 | 70 | 13.7 |
| 4 | NULL | 13.4 |
+--------+--------+---------------+
查询
SELECT MAX(Weight) AS MaxWeight,
AVG(Circumference) AS AvgCircumference
FROM Cakes
Returns
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| 80 | 13.325 |
+-----------+------------------+
尽管从技术上讲不可能肯定地说 80 是最重的蛋糕的重量(因为未知数可能更大),但上面的结果通常比简单地返回未知数更有用。
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| ? | 13.325 |
+-----------+------------------+
您很可能希望忽略 NULL,而警告只是提醒您这种情况正在发生。