如果第一个条件失败,SQL 会检查每个 And 条件吗?

IT *_*her 3 performance sql-server execution-plan sql-server-2008-r2 query-performance

对于以下类型的查询,And如果第一个And条件失败,sql是否会为每个条件处理数据?如果某行的 Emp_ID 不是 12,那么它会检查 Emp_Name 的条件吗?那么SQL是如何处理这种查询的呢?

SELECT [Emp_ID],[Emp_Name],[Emp_Sal] FROM [gyh].[dbo].[Employee_Demo] where Emp_ID='12' And Emp_Name like '%ab%'
Run Code Online (Sandbox Code Playgroud)

Mar*_*son 7

你说的是短路评估

与顺序很重要的 CASE 语句(使用变量和聚合函数的某些情况除外)不同,您几乎无法控制WHERESQL Server 中子句的计算顺序(除了一些分组括号)。因此,即使它确实短路,SQL Server 也可能选择首先评估第二个子句,特别是如果它被引用为它选择用于查询的索引中的第一列。

SQL服务器仍然试图解析整个查询,以确保它在逻辑上是正确的,不管是否第一AND条件失败。

例如,如果我使用 AdventureWorks 数据库并查找我知道不存在的城市:

USE AdventureWorks;
GO

-- obviously don't use SELECT * in production
SELECT 
   * 
FROM Person.Address AS a
WHERE City = 'Bournemouth' AND 1/0 = 1
Run Code Online (Sandbox Code Playgroud)

即使City = 'Bournemouth'永远是FALSE,我仍然收到错误:

Msg 8134, Level 16, State 1, Line 5
Divide by zero error encountered.
Run Code Online (Sandbox Code Playgroud)