【问题标题】:SQL IF EXISTS ignores errors?SQL IF EXISTS 忽略错误?
【发布时间】:2018-03-18 11:59:41
【问题描述】:

我正在使用 SQL Server。

这个查询:

SELECT 3/0 AS X

按预期返回错误:

消息 8134,第 16 级,状态 1,第 1 行
遇到除以零错误。

IF EXISTS 将 X 视为存在的行。这个查询:

IF EXISTS (SELECT 3/0 AS X) 
    PRINT 'SUCCESS'
ELSE 
    PRINT 'FAILURE'

返回“成功”。我在 IF EXISTS 文档中找不到任何解释此行为的内容。任何人都可以对此有所了解吗?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    它并没有专门“忽略”错误。它忽略了select 子句中的所有内容(top (0) 除外)。

    exists 正在检查查询是否返回了任何 。作为优化,它忽略了查询的select 部分,因为这不会影响行的存在。

    顺便说一下,case 的效果是一样的:

    select (case when 1=1 then 1 else 1/0 end)
    

    也返回 1 而不是错误。

    【讨论】:

      【解决方案2】:

      SELECT 语句中的表达式不需要为 SQL Server 处理 EXISTS 谓词进行计算。查看执行计划以了解优化器对此查询做了什么:

      请注意,标量运算符返回的VALUES 不是SELECT 子句中指定的那些。不会发生错误,因为查询中使用的实际表达式不被零除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-24
        • 2013-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多