Assert Showplan 運算子
Assert 運算子會驗證條件。例如,它會驗證參考完整性,或確定純量子查詢傳回一個資料列。Assert 運算子會針對每個輸入資料列來評估執行計畫之 Argument 資料行中的運算式。如果這個運算式評估為 NULL,代表資料列通過 Assert 運算子的驗證,則查詢會繼續執行。如果這個運算式得出非 Null 值,就會引起適當的錯誤。
Assert 運算子是實體運算子。
圖形化執行計畫圖示
範例
A. 驗證 CHECK 條件約束
下列範例會在 Employee 資料表中更新指定員工識別碼之 Gender 資料行的值。此資料表具有會將資料行可接受的值限制為 'F' 和 'M' 的 CHECK 條件約束。查詢執行計畫的輸出顯示,查詢最佳化工具會使用 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)