2016-06-15 88 views
0

在我的查詢是此行System.Data.SqlTypes.SqlNullValueException對空字符串PARAM

//query... 
"AND (@4 = '' OR (p.FirstName + p.LastName LIKE '%' + @4 + '%') OR (eup.FirstName + eup.LastName LIKE '%' + @4 + '%')) " + 
//more query... 

這是給我一個​​例外。參數@4即爲""。當我將其更改爲

"AND (@4 IS NULL OR (p.FirstName + p.LastName LIKE '%' + @4 + '%') OR (eup.FirstName + eup.LastName LIKE '%' + @4 + '%')) " + 

它沒有返回任何表中沒有名或姓的記錄。

我該如何解決這個問題?如果參數4爲空,我希望返回所有記錄,而不管名稱是否存在。

回答

1

除非paramenter @4包括第一和姓氏沒有空格或任何東西,我懷疑你正在尋找任何匹配@4第一或姓氏,如果@4爲空,則返回的一切。

AND (p.FirstName LIKE '%' ISNULL(@4,'') + '%' 
    OR p.LastName LIKE '%' ISNULL(@4,'') + '%' 
    OR eup.FirstName LIKE '%' ISNULL(@4,'') + '%' 
    OR eup.LastName LIKE '%' ISNULL(@4,'') + '%' 
    ) 

通過使用ISNULL(@4,'')這將從根本上把你的名和姓成一個完整的通配符搜索和恢復一切,因爲它仍然會之前和之後有「%」。我可能會建議改變這種情況,以便只有'%',因爲您可能會得到更多用於人們查看的結果,但這取決於您。

p.FirstName + p.LastName LIKE的主要問題是,Bob Smith將成爲BOBSMITH LIKE ....但是我想,如果你堅持使用% search string %它仍然會返回在事業將搜索結果@4切換你ISNULL(@4,''),擺脫第一@4 = ''

+0

paramater'@ 4'是連接的名字和姓氏。我將徹底重構這個查詢,我不喜歡它的任何內容。 –

+0

@ USER_8675309我剛剛看到上面的其他評論。如果您真的在尋找解決方案來搜索員工數據集與您的AD記錄,我敢打賭,他們有幾個問題可以幫助您找到自己想要的東西。如果不是的話,我會把它放在問題本身,因爲這是讓人們知道何時提供答案的好信息。 – Matt

+0

確實。我認爲這裏有兩個單獨的問題,一個是關於SQL的''''vs'null',另一個關於AD用戶。我們前進的解決方案是爲前進的AD用戶創建人員記錄,並使用腳本將現有AD用戶回填到人員表中。不過謝謝你們的幫忙。我最終使用了你和phil答案之間的混合。 –

1

我會猜測你的評論「在任一表中沒有名字或姓氏」表明這些字段是可空的。
執行任何操作(如p.FirstName + p.Lastname)將會給出null結果,前提是兩個值中的任何一個值都爲空,而這又會導致謂詞導致false。 此外,我個人不會在任何時候協調這兩個字段,因爲您的LIKE謂詞可以匹配名字末尾的字符和lastnmame的開始。

理想情況下,你已經shound的字段設置爲NOT NULL,然後做..

"AND (@4 IS NULL 
    OR p.FirstName LIKE '%' + @4 +'%' 
    OR p.LastName LIKE '%' + @4 + '%' 
    OR eup.FirstName LIKE '%' + @4 +'%' 
    OR eup.LastName LIKE '%' + @4 + '%')) " + 

如果字段必須保持爲空的做..

"AND (@4 IS NULL 
    OR coalesce(p.FirstName,'') LIKE '%' + @4 +'%' 
    OR coalesce(p.LastName,'') LIKE '%' + @4 + '%' 
    OR coalesce(eup.FirstName,'') LIKE '%' + @4 +'%' 
    OR coalesce(eup.LastName,'') LIKE '%' + @4 + '%')) " + 

這些都不 - 或者你版本 - 將受益於字段上的索引,因此在大型表上,性能可能會很糟糕。

+0

這些字段不爲空。這裏的問題是AD用戶存儲在我無法在此查詢中訪問它們的地方,因此用戶存在沒有相應人員記錄的潛力。我知道這很愚蠢,但是工作範圍並不涉及任何重構。 –