1

我有以下声明:

SELECT CASE WHEN (1 = 1) THEN 10 ELSE dbo.at_Test_Function(5) END AS Result 

我只是想确认在这种情况下该功能不会被执行?

我问的原因是该函数特别慢,如果条件是真的,我想避免调用该函数......

干杯安东尼

4

4 回答 4

4

你的假设是正确的——它不会被执行。我理解您的担忧,但 CASE 构造以这种方式是“智能的”——它不会在第一个有效条件之后评估任何条件。这是一个证明它的例子。如果要执行此 case 语句的两个分支,您将收到“除以零”错误:

SELECT  CASE
                WHEN 1=1 THEN 1
                WHEN 2=2 THEN 1/0
            END AS ProofOfConcept

这有意义吗?

于 2009-05-13T05:09:14.323 回答
3

不要做这个假设,这是错误的。查询优化器可以完全自由地选择它喜欢的评估顺序,并且 SQL 作为一种语言不提供运算符短路。即使您可能在测试中发现该函数从未被评估,但在生产中您可能会时不时地遇到导致服务器选择不同执行计划并首先评估函数,然后是表达式的其余部分的条件。一个典型的例子是,当服务器注意到函数返回是确定性的并且不依赖于行数据时,在这种情况下,它会首先评估函数以获取值,然后开始扫描表并评估 WHERE 包含条件使用预先确定的函数值。

于 2009-05-13T16:44:49.193 回答
0

假设你正在做某种测试......如果你想避免 at_Test_Function,为什么不把它注释掉然后做

SELECT 10 AS Result
于 2009-05-13T05:05:12.083 回答
0

将 aWaitFor Delay '00:00:05'放入函数中。如果语句立即返回,则如果需要 5 秒才能返回,则它没有执行,则它已被执行。

于 2009-05-13T05:08:33.670 回答