我正在使用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文档中找到解释此行为的任何内容。任何人都可以对此有所了解吗?
答案 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谓词。查看执行计划以查看优化程序对此查询执行的操作:
请注意,标量运算符返回的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
。不会发生错误,因为查询中使用的实际表达式不会除以零。