Assert Showplan 运算符
Assert 运算符用于验证条件。例如,验证引用完整性或确保标量子查询返回一行。对于每个输入行,Assert 运算符都要计算执行计划的 Argument 列中的表达式。如果此表达式的值为 NULL,则通过 Assert 运算符传递该行,并且查询执行将继续。如果此表达式的值非空,则将产生相应的错误。
Assert 运算符是一个物理运算符。
图形执行计划图标
示例
A. 验证 CHECK 约束
以下示例将更新 Employee 表中某指定雇员 ID 的 Gender 列中的值。此表具有 CHECK 约束,该约束将列中允许的值限于值“F”和“M”。查询执行计划的输出说明:查询优化器使用 Assert 运算符,根据 CHECK 约束来验证在 UPDATE 语句中指定的值,并在不满足约束条件时引发错误。
USE AdventureWorks2008R2;
GO
SET NOCOUNT ON;
GO
SET SHOWPLAN_ALL ON;
GO
UPDATE HumanResources.Employee
SET Gender = 'X' WHERE BusinessEntityID = 1;
GO
SET SHOWPLAN_ALL OFF;
GO
Assert 运算符的执行计划输出如下所示。
PhysicalOp
-----------------------------------------------------------------------
Assert
Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN upper([AdventureWorks2008R2].[HumanResources].[Employee].[Gender])<>N'F' AND
upper([AdventureWorks2008R2].[HumanResources].[Employee].[Gender])<>N'M' THEN
(0) ELSE NULL END)
B. 验证 FOREIGN KEY 约束
下面的示例将删除 Person.Person 表中的一行。在此示例中,六个表具有对此表中 BusinessEntityID 列的外键引用。查询执行计划的输出说明查询优化器使用 Assert 运算符依据各个约束来验证 DELETE 语句。
USE AdventureWorks2008R2;
GO
SET NOCOUNT ON;
go
SET SHOWPLAN_ALL ON;
GO
DELETE Person.Person WHERE BusinessEntityID = 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 AdventureWorks2008R2;
GO
SET NOCOUNT ON;
go
SET SHOWPLAN_ALL ON;
GO
SELECT BusinessEntityID
FROM HumanResources.Employee
WHERE BusinessEntityID = (SELECT BusinessEntityID FROM Person.Person);
GO
SET SHOWPLAN_ALL OFF;
GO
-- Run the query again to display the error message raised by the
-- Assert Operator.
SELECT BusinessEntityID
FROM HumanResources.Employee
WHERE BusinessEntityID = (SELECT BusinessEntityID FROM Person.Person);
GO
Assert 运算符的执行计划输出如下所示。
PhysicalOp
-----------------------------------------------------------------------
Assert
Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN [Expr1007]>(1) THEN (0) ELSE NULL END)