2012-11-17 56 views
1

在SQL Server 2012中,我有這個where子句一個很大的查詢:條件「去哪兒」條款和自定義功能

(1 = Case 
    When (@bSomeSpecialCheck = 'Y') Then 
     Case When (dbo.SomeFunction(SomeColumn, @SomeParam)=1) Then 1 Else 0 End 
Else 1 End) 

我知道「SomeFunction」是一個緩慢的過程,我希望這樣的僅在@SomeParam中存在值時才被評估。所以我寫了這種方式,因爲如果不需要,我想避免執行「SomeFunction」。

那麼,事情是,無論@bSomeSpecialCheck始終是「N」,似乎SQL Server正在評估整個案件,因爲如果我把它寫這樣的測試目的:

(1 = Case 
    When (@bSomeSpecialCheck = 'Y') Then 
     Case When (1=1) Then 1 Else 0 End 
Else 1 End) 

我得到即時響應,所以我知道我的慢函數「SomeFunction」正在被評估,但爲什麼? 僅當@bSomeSpecialCheck爲「Y」時,我如何避免評估SomeFunction?

+2

你可以作爲參數添加到@bSomeSpecialCheck和dbo.SomeFunction決定裏面有什麼回報,有或沒有計算... – bummi

+0

的只調用「SomeFunction」已經引起緩慢,因爲有大約200,000條記錄需要評估,我試圖通過使函數變爲虛擬並立即返回true,並且它與啓用內部計算一樣慢。 –

+0

您的原始表情可以被分解。以下是功能上相當的和更簡短的:'1 = CASE WHEN @bSomeSpecialCheck ='Y'THEN dbo.SomeFunction(SomeColumn,@SomeParam)ELSE 1 END' –

回答

3

我認爲要避免這種情況的唯一方法是複製您的查詢

if (@bSomeSpecialCheck = 'Y') Then 
begin 
    Whole Query with function 
end 
else 
begin 
    Whole Query without function 
end 
+0

這實際上是一個可行的方法。 – usr