IF条款的SQL评估

N t*_*N t 9 sql sql-server-2008

抱歉,如果这不合适,但实际上这是'为什么'而不是'如何'.不确定是否合适,但不知道一个更好的地方问我想不出如何用谷歌来表达我想要的东西.

    IF 'hell' = 'freezing over'
    BEGIN
    SELECT log(0)
    END
Run Code Online (Sandbox Code Playgroud)

看那个陈述.没有一个世界,其中IF条款将是真实的.如果我尝试运行它,我希望SQL跳过IF子句并移到最后.相反,我得到:

An invalid floating point operation occurred.
Run Code Online (Sandbox Code Playgroud)

这很奇怪.所以我猜这只是SQL做事的方式.除了...

    IF 'hell' = 'freezing over'
    BEGIN
    SELECT 1/0
    END
Run Code Online (Sandbox Code Playgroud)

这里没有错误.IF子句中的语句仍应生成错误.谁能解释为什么这不会发生?

这是在调试大量SQL计算时出现的,其中EXP(SUM(LOG()))用于在if子句中累积数据.我可以改变代码来阻止再次发生这种情况,但为什么它会在一个未满足的IF子句中进行评估.

干杯.

编辑:额外的娱乐.试着抓?Pffft

    IF 1=2
    BEGIN
        BEGIN TRY
            SELECT SQRT(-1)
        END TRY
        BEGIN CATCH
        END CATCH
    END
Run Code Online (Sandbox Code Playgroud)

非数学:

    IF 1=2
    BEGIN
    SELECT SUBSTRING('hello',-1,-1)
    END
Run Code Online (Sandbox Code Playgroud)

Ale*_* K. 7

我的猜测log(0)是由于常数折叠而过早地进行有效评估,而1/0不是由于其基数估计,或者更可能是ANSI_WARNINGS设置将影响除以零的所需结果(溢出与NULL).