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 中有值时才对其进行评估。所以我用这种方式写了 where,因为如果不需要,我想避免执行“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?

4

1 回答 1

3

我认为避免这种情况的唯一方法是复制您的查询

if (@bSomeSpecialCheck = 'Y') Then
begin
   Whole Query with function
end
else
begin
  Whole Query without function
end 
于 2012-11-18T00:05:14.017 回答