2009-12-05 68 views
2

假設在SQL Server中的表定義如下:在使用空列WHERE子句

CREATE TABLE MyTable (
    Id UNIQUEIDENTIFIER NULL, 
    Info VARCHAR(MAX) 
) 

和查詢:

DECLARE @id UNIQUEIDENTIFIER 
DECLARE @info VARCHAR(MAX) 
IF @id IS NOT NULL 
BEGIN 
    SELECT @info = Info 
    FROM MyTable 
    WHERE Id = @id 
END 

在這種情況下,Visual Studio的靜態代碼分析儀產生以下錯誤:

Warning : SR0007 : Microsoft.Performance : Nullable columns can cause final results to be evaluated as NULL for the predicate.

我在這裏沒有看到問題。錯誤與績效有關; MSDN說我應該使用ISNULL() - 但是一個等於NULL的比較總是爲false,對吧?我錯過了什麼,或者是錯誤的警告?

+0

會發生什麼[忽略此警告。該建議對性能不利](http://stackoverflow.com/questions/7471740/does-wrapping-nullable-columns-in-isnull-cause-table-scans) – 2013-07-02 11:58:31

回答

3

我認爲這是指WHERE子句我不會做。這就是說你的參數和列都可以是NULL,在這種情況下你的WHERE子句不再計算爲真/假。通過將可空列轉化爲一個始終具有定義的值(通過ISNULL)的列,您的狀態變得更好,邏輯性更強。

Here's the Microsoft documentation on that error.

在一旁,空值理應進行查詢一個skosh慢。

+0

啊哈!這是他們在哪裏*兩個* NULL,它試圖抱怨 - 除非我在WHERE子句中使用IF或更多細節來排除這種情況,分析器不會檢測它。你的意思是一個可空列比一個不可空列更慢?或者你說的是ISNULL嗎? – RickNZ 2009-12-05 13:17:40

+0

我聲稱一個可空列比取不可空列要慢。爲了支持這樣做,可以用一些可以爲空的鹽來代替= D – 2009-12-05 13:19:07

-1
IF @id IS NOT NULL 

IF ISNull(@id, -1) <> -1 
+0

@Raj是不是完全一樣的「如果@id不爲空「? 改變它有什麼意義? – dan 2009-12-05 12:52:23

+0

該代碼實際上甚至不會編譯,因爲@id是一個GUID,而不是INT。 – RickNZ 2009-12-05 13:03:02

+0

哎呀,我以爲id是一個整數,對不起。 – Raj 2009-12-05 13:22:42

1

代替我覺得分析可能只是沒有考慮到你的IF語句。

你的代碼似乎對我正確。

+0

該消息抱怨可空列,而不是可爲空的參數。另外,如果我將WHERE子句更改爲:'Id不是NULL並且Id = @ id'或'@id不是NULL並且Id = @id',則消息將持續。 – RickNZ 2009-12-05 13:08:23

-2

@拉吉說: 「如果ISNULL(@id,-1)<> -1」

,因爲它其實是將表項

+0

更好地把這個作爲對@ Raj的回答的評論... – RickNZ 2009-12-05 13:09:40

+0

但是不幸的是我是新的並且沒有足夠的積分(或聲譽)來評論:(http://stackoverflow.com/faq – ram 2009-12-05 18:12:50

0

空比較取決於設置。

When SET ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN

When SET ANSI_NULLS is ON, a SELECT statement that uses WHERE column_name = NULL returns zero rows even if there are null values in column_name. A SELECT statement that uses WHERE column_name <> NULL returns zero rows even if there are no nnull values in column_name.

When SET ANSI_NULLS is OFF, the Equals (=) and Not Equal To (<>) comparison operators do not follow the ISO standard.

這是from here

1

我認爲這是一個虛假的警告 - 你可以在個案的基礎上抑制它,或完全是特定的警告?

,當你做到這一點?:

CREATE TABLE MyTable (
    Id UNIQUEIDENTIFIER NOT NULL, 
    Info VARCHAR(MAX) 
) 
+0

將它改爲NOT NULL可以消除警告,我可能會最終壓制這個消息;我只是想確保我完全理解爲什麼它首先發生,並報告它是否真的是一個錯誤。 – RickNZ 2009-12-06 03:02:39