比较存储过程中的可空字段

时间:2011-10-27 20:18:39

标签: tsql sql-server-2008 stored-procedures

我遇到了存储过程的问题。它将新记录与现有记录进行比较以检查更改。这是这样做的:

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

确实有效。有一个更好的方法吗?

3 个答案:

答案 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了解详情。