在存储过程中,我有这个查询
DECLARE @BadRowsCount int;
SET @BadRowsCount = 0;
SELECT @BadRowsCount = COUNT(*)
FROM #ImportTemp
WHERE #ImportTemp.Status <> 'A' AND #ImportTemp.Status <> 'B'
@BadRowsCount
如果#ImportTemp.Status
中的值不同于A或B,则值为正值。
但如果在#ImportTemp.Status
中为NULL @BadRowsCount
为0.
为什么呢? NULL与A或B没有区别?
状态定义为:
[Status] [varchar](80) NULL
我必须定义WHERE子句,如:
WHERE (#ImportTemp.Status <> 'A' AND #ImportTemp.Status <> 'B') OR #ImportTemp.Status is NULL
答案 0 :(得分:2)
默认情况下,在SQL Server中,如果任一值为null,则比较运算符将返回UNKNOWN(即,不为true或false)。
MSDN IS [NOT] NULL文档
有很多方法可以改变SQL Server处理与SET ANSI_NULLS之类的内容进行空比较的方式。绝对要注意即将对此值的默认值进行更改。
这是一个interesting article,它涵盖了与空值处理相关的几个问题。
答案 1 :(得分:1)
因为不等于运算符(<>
)与大多数运算符一样,不是 NULL save 。这意味着当与NULL比较时,它会导致 unknown 。