我有这个模式
create table t(id int, d date)
insert into t (id, d) values (1, getdate()),
(2, NULL)做的时候
declare @mindate date
select @mindate = min(d) from t我收到警告了
空值由聚合或其他集操作消除。
为什么我能做些什么?
发布于 2013-09-10 13:09:08
大多数情况下你不应该做任何事。
ansi_warnings关闭警告,但这有其他影响,例如,如何处理零除法,当查询使用索引视图、计算列或XML方法等功能时,可能会导致失败。COUNT(nullable_column)重写为SUM(CASE WHEN nullable_column IS NULL THEN 0 ELSE 1 END),但这并不总是能够在不更改语义的情况下直接完成。它只是一条信息消息SQL标准中要求的。除了在消息流中添加不必要的噪声之外,它没有任何不良影响(除了Server不能绕过读取NULL行之外,后者可以具有头顶,但禁用警告在这方面不能给出更好的执行计划)
返回此消息的原因是在SQL中的大多数操作中传播。
SELECT NULL + 3 + 7返回NULL (将NULL视为未知数量,这是有意义的,因为? + 3 + 7也是未知的)
但
SELECT SUM(N)
FROM (VALUES (NULL),
(3),
(7)) V(N) 返回10和忽略空值的警告。
但是,这些都是,这正是典型聚合查询所需的语义。否则,单个NULL的存在将意味着该列对所有行的聚合最终都会产生NULL,这不是很有用。
是下面最重的蛋糕? (像源,创意共享图像被我修改(裁剪和注释))

在第三个蛋糕称好之后,天平断了,所以没有关于第四个蛋糕的信息,但是仍然有可能测量圆周。
+--------+--------+---------------+
| 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 返回
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| 80 | 13.325 |
+-----------+------------------+即使从技术上讲,不能肯定地说80是最重蛋糕的重量(因为未知的数目可能更大),上述结果通常比简单地返回未知的结果更有用。
+-----------+------------------+
| MaxWeight | AvgCircumference |
+-----------+------------------+
| ? | 13.325 |
+-----------+------------------+因此,您很可能希望NULLs被忽略,而警告只是提醒您这一事实正在发生。
发布于 2013-09-10 13:17:26
我认为在这种情况下您可以忽略这个警告,因为您使用了MIN函数。
“除计数外,聚合函数忽略空值”
请参阅聚合函数(Transact-SQL)
发布于 2013-09-10 12:50:50
在您的情况下,min()应该作为d的最低值返回什么?
该错误通知您,min()函数没有考虑到null记录。
因此,如果它应该忽略NULL值并返回最低的现有日期,那么您可以忽略此警告。
如果您还喜欢为这条语句取消警告,那么您可以这样做
set ansi_warnings off
select @mindate = min(d) from t
set ansi_warnings on如果您希望通过使用默认值来考虑NULL值,那么您可以设置一个默认值,如下所示
select @mindate = min(isnull(d, cast(0 as datetime)))
from thttps://stackoverflow.com/questions/18719436
复制相似问题