我有以下声明:
SELECT CASE WHEN (1 = 1) THEN 10 ELSE dbo.at_Test_Function(5) END AS Result
我只是想确认在这种情况下函数不会被执行?
我问的理由是功能特别慢,如果标准是真的,我想避免调用函数......
干杯 安东尼
答案 0 :(得分:4)
你的假设是正确的 - 它不会被执行。我理解您的担忧,但CASE结构以这种方式“智能” - 它不会在第一个有效条件之后评估任何条件。这是一个证明它的例子。如果要执行此case语句的两个分支,则会出现“除以零”错误:
SELECT CASE
WHEN 1=1 THEN 1
WHEN 2=2 THEN 1/0
END AS ProofOfConcept
这有意义吗?
答案 1 :(得分:3)
不要做出这个假设,它是错误。查询优化器完全可以自由选择它喜欢的评估顺序,SQL作为一种语言不提供操作员短路。即使您在测试中发现函数永远不会被评估,但在生产中您可能会偶尔遇到导致服务器选择不同执行计划并首先评估函数的条件,然后是表达式的其余部分。一个典型的例子是当服务器注意到函数返回是确定性的并且不依赖于行数据时,在这种情况下它将首先评估函数以获取值,并且在之后开始扫描使用预先确定的函数值来表和评估WHERE包含标准。
答案 2 :(得分:0)
假设您正在进行某种测试...如果您试图避开at_Test_Function,为什么不只是将其注释掉并执行
SELECT 10 AS Result
答案 3 :(得分:0)
在函数中放置WaitFor Delay '00:00:05'
。如果语句立即返回,则如果返回则需要5秒才执行,然后执行。