2011-10-27 32 views
1

我遇到了存儲過程的問題。它將比較新記錄和現有記錄來檢查更改。這是這樣做的:比較存儲過程中的可空字段

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

我也對這種煩惱感興趣。 –

+0

如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)以精確地設置格式並對其進行語法突出顯示! –

回答

2

SET ANSI_NULLS can control this behavior...設置SET ANSI_NULLS OFF將使NULL = NULL評估爲true。

但我建議不要實際設置SET ANSI_NULLS OFF,而是嘗試限制數據庫中「可空」的字段。

+1

我建議不要這樣做,特別是因爲'SET ANSI_NULLS OFF'是[不建議使用的功能](http://msdn.microsoft.com/zh-cn/library/ms143729.aspx)。 –

+0

謝謝。不幸的是,我不能限制可空字段的數量,所以我將使用ANSI_NULLS選項。但我會確保明智地使用它;) – Jasper

+0

@JoeStefanelli好的,但你會推薦什麼來做適當的檢查? – Jasper

2

您可以使用支票這樣的:

ISNULL(Field1, '') = ISNULL(@Field1, '') 

有一個drowback這樣做:你可以有平等像

NULL='' or ''=NULL 

我dont't知道,如果它可以在您的方案可以接受。

+0

如果性能不是問題,這很好,但它不是可靠的。 – HLGEM

1

此行爲受ANSI_NULLS設置管轄。默認設置爲ON,需要按照這種方式設置各種事情才能正常工作(如索引視圖和分佈式查詢),但如果您不需要這些,則可以將其關閉。

閱讀更多關於它在Books Online

+1

正如我對另一個答案的評論,請注意'SET ANSI_NULLS OFF'是一個[不建議使用的功能](http://msdn.microsoft.com/en-us/library/ms143729.aspx),它將在某個時候被帶走在將來。 –