SQL IF EXISTS忽略错误?

时间:2018-03-18 11:59:42

标签: sql sql-server

我正在使用SQL Server。

此查询:

SELECT 3/0 AS X

按预期返回错误:

  

Msg 8134,Level 16,State 1,Line 1
  遇到零除错误。

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

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

返回' SUCCESS'。我无法在IF EXISTS文档中找到解释此行为的任何内容。任何人都可以对此有所了解吗?

2 个答案:

答案 0 :(得分:4)

具体而言,并非完全“忽略”错误。它忽略了select子句中的所有内容(top (0)除外)。

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

顺便提一下,您使用case获得了相同的效果:

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

也会返回1而不是错误。

答案 1 :(得分:3)

不需要评估SELECT语句中的表达式,以便SQL Server处理EXISTS谓词。查看执行计划以查看优化程序对此查询执行的操作:

IF EXISTS Plan

请注意,标量运算符返回的VALUES不是SELECT子句中指定的MAC_Source | MAC_Dest | Other cols --------------------------------------------------- AA:BB:CC:DD:EE:FF FF:EE:DD:CC:BB:AA Other data 11:22:33:44:55:66 66:55:44:33:22:11 Other data 。不会发生错误,因为查询中使用的实际表达式不会除以零。