条件“Where”子句和自定义函数

时间:2012-11-17 23:28:07

标签: sql-server where-clause sql-server-2012

在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的评估?

1 个答案:

答案 0 :(得分:3)

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

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