在 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?