2012-09-20 32 views
2

我正在SQL Server環境中工作,沉重於存儲過程,其中很多過程使用0和''而不是Null來指示沒有傳遞有意義的參數值。什麼是與T-SQL中的空字符串進行比較的最快方法?

這些參數經常出現在WHERE子句中。通常的模式是一樣的東西

WHERE ISNULL(SomeField,'') = 
    CASE @SomeParameter 
     WHEN '' THEN ISNULL(SomeField,'') 
     ELSE @SomeParameter 
    END 

出於各種原因,它是一個更容易做出改變,以一個進程比改變調用它的代碼。因此,如果調用代碼將空字符串傳遞給null參數,那麼與空字符串進行比較的最快方法是什麼?

我已經想到了一些方法:

@SomeParameter = '' 

NULLIF(@SomeParameter,'') IS NULL 

LEN(@SomeParameter) = 0 

我也考慮在proc早期檢查參數,如果它等於「將它設置爲NULL」,只是做一個@SomeParameter IS NULL測試在實際的WHERE子句中。

還有什麼其他方法?什麼是最快的?

非常感謝。

+0

問:「我在一個SQL Server環境中工作,很多過程使用0和''而不是Null來指示沒有傳遞有意義的參數值。」A:這不是一件快樂的事情:)無論它值多少,我發現您的解決方法沒有任何問題。恕我直言... – paulsm4

+3

這不是字符串比較,這是問題。這是計劃重用這些捕獲所有查詢。 'WHERE ISNULL(SomeField,'')'完全無法修改。參見[T-SQL中的動態搜索條件](http://www.sommarskog.se/dyn-search.html) –

+0

@MartinSmith太棒了!感謝您的鏈接! –

回答

1

在proc開始處對參數進行排序必須比where子句中的多個條件或在一個函數中使用函數更快。查詢越複雜,或者需要過濾的記錄越多,增益越大。

如果程序自變量缺乏可空性,也會嚇到我。如果當你開始鎖定事物時,你的查詢將返回「錯誤」結果。

如果這個產品有一定的壽命,那麼我認爲容易是長期錯誤的解決方案,它應該在調用應用程序中糾正。如果不是,那麼可能是你應該把它放在一邊,因爲你會做的一切是從一個地毯下,在另一個地毯下掃蕩...

你打算如何測試這些變化,機會你引入了一個小錯誤,雖然你的頭骨無聊,一次又一次地做出同樣的改變,非常高。

+0

您的所有觀察結果都很精明,但不幸的是,可用的時間和資源不允許完整的返工。所以我只是盡我所能,並盡力避免任何事情做完一半。 –

+0

一半完成。哦,當然,你可以達到99%:),只是這種徘徊的猜疑在每個疏忽時刻都會引入另一個問題。 –

相關問題