在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的评估?
答案 0 :(得分:3)
我认为避免这种情况的唯一方法是复制您的查询
if (@bSomeSpecialCheck = 'Y') Then
begin
Whole Query with function
end
else
begin
Whole Query without function
end