我遇到了存储过程的问题。它将新记录与现有记录进行比较以检查更改。这是这样做的:
SELECT 1 FROM Table
WHERE Id= @Id
AND Field1 = @Field1
AND Field2 = @Field2
AND Field3 = @Field3
AND Field4 = @Field4
AND Field5 = @Field5
AND LEDTS IS NULL
当字段为NULL时,这似乎失败了。我知道= NULL不会像你期望的那样工作,但我不知道它在这样的事情上也失败了。当我将字段比较更改为
之类的内容时(Field1 IS NULL AND Field2 IS NULL) OR Field1 = @Field2
确实有效。有一个更好的方法吗?
答案 0 :(得分:2)
SET ANSI_NULLS
can control this behavior...设置SET ANSI_NULLS OFF
会使NULL = NULL
评估为真。
但我建议不要实际设置SET ANSI_NULLS OFF
,而是尝试限制数据库中“可空”的字段。
答案 1 :(得分:2)
您可以使用以下支票:
ISNULL(Field1, '') = ISNULL(@Field1, '')
这样做有一个缺点:你可以拥有像
这样的平等NULL='' or ''=NULL
我不知道你的情景是否可以接受。
答案 2 :(得分:1)
此行为受ANSI_NULLS
设置的约束。默认为ON
,需要以这种方式设置才能使各种事物正常工作(例如索引视图和分布式查询),但如果不需要,可以将其关闭。
在Books Online了解详情。