Assert Showplan 运算符

Assert 运算符用于验证条件。例如,验证引用完整性或确保标量子查询返回一行。对于每个输入行,Assert 运算符都要计算执行计划的 Argument 列中的表达式。如果此表达式的值为 NULL,则通过 Assert 运算符传递该行,并且查询执行将继续。如果此表达式的值非空,则将产生相应的错误。

Assert 运算符是一个物理运算符。

Assert 运算符图标图形执行计划图标

示例

A. 验证 CHECK 约束

以下示例将更新 Employee 表中某指定雇员 ID 的 Gender 列中的值。此表具有 CHECK 约束,该约束将列中允许的值限于值“F”和“M”。查询执行计划的输出说明:查询优化器使用 Assert 运算符,根据 CHECK 约束来验证在 UPDATE 语句中指定的值,并在不满足约束条件时引发错误。

USE AdventureWorks;
GO
SET NOCOUNT ON;
GO
SET SHOWPLAN_ALL ON;
GO
UPDATE HumanResources.Employee
SET Gender = 'X' WHERE EmployeeID = 1;
GO
SET SHOWPLAN_ALL OFF;
GO

Assert 运算符的执行计划输出如下所示。

PhysicalOp 
-----------------------------------------------------------------------
Assert

Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN upper([AdventureWorks].[HumanResources].[Employee].[Gender])<>N'F' AND 
upper([AdventureWorks].[HumanResources].[Employee].[Gender])<>N'M' THEN 
    (0) ELSE NULL END)

B. 验证 FOREIGN KEY 约束

下面的示例将删除 Person.Contact 表中的一行。在此示例中,六个表具有对此表中 ContactID 列的外键引用。查询执行计划的输出说明查询优化器使用 Assert 运算符依据各个约束来验证 DELETE 语句。

USE AdventureWorks;
GO
SET NOCOUNT ON;
go
SET SHOWPLAN_ALL ON;
GO
DELETE Person.Contact WHERE ContactID = 1209;
GO
SET SHOWPLAN_ALL OFF;
GO

Assert 运算符的执行计划输出如下所示。

PhysicalOp 
-----------------------------------------------------------------------
Assert

Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN NOT [Expr1030] IS NULL THEN (0) ELSE CASE WHEN NOT 
[Expr1031] IS NULL THEN (1) ELSE CASE WHEN NOT [Expr1032] IS NULL THEN 
(2) ELSE CASE WHEN NOT [Expr1033] IS NULL THEN (3) ELSE CASE WHEN NOT 
[Expr1034] IS NULL THEN (4) ELSE CASE WHEN NOT [Expr1035] IS NULL THEN (5) ELSE NULL END END END END END END)

C. 验证标量子查询

以下示例在查询的 WHERE 子句中使用了子查询。此示例特意使用返回多行的子查询来强制 Assert 运算符引发错误。查询执行计划的输出说明查询优化器使用 Assert 运算符来确保 SELECT 语句中指定的子查询仅返回一行。

USE AdventureWorks;
GO
SET NOCOUNT ON;
go
SET SHOWPLAN_ALL ON;
GO
SELECT EmployeeID 
FROM HumanResources.Employee
WHERE ContactID = (SELECT ContactID FROM Person.Contact);
GO
SET SHOWPLAN_ALL OFF;
GO
-- Run the query again to display the error message raised by the 
-- Assert Operator.
SELECT EmployeeID 
FROM HumanResources.Employee
WHERE ContactID = (SELECT ContactID FROM Person.Contact);
GO

Assert 运算符的执行计划输出如下所示。

PhysicalOp 
-----------------------------------------------------------------------
Assert

Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN [Expr1007]>(1) THEN (0) ELSE NULL END)