Assert プラン表示操作
Assert 操作は、状態の検証を行います。たとえば、参照整合性の検証や、スカラー サブクエリによって 1 行返されることの確認を行います。入力行ごとに、Assert 操作によって実行プランの Argument 列の式が評価されます。この式が NULL であると評価されると、行は Assert 操作を通過して、クエリの実行が継続されます。式が NULL 以外の値に評価されると、相応のエラーが発生します。
Assert 操作は物理操作です。
グラフィカルな実行プランのアイコン
例
A. CHECK 制約の検証
次の例では、Employee テーブルの指定された従業員 ID の Gender 列の値を更新します。このテーブルには、列で許容される値を "F" および "M" に制限する CHECK 制約があります。クエリ実行プランの出力は、クエリ オプティマイザーでは UPDATE ステートメントで指定された値を CHECK 制約に対して検証するために Assert 操作が使用されていて、制約の条件を満たしていない場合はエラーが発生することを示しています。
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
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)
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 列を参照する外部キーを持つテーブルが 6 個存在します。クエリ実行プランの出力は、クエリ オプティマイザーではこれらの各制約に対して DELETE ステートメントを検証するために Assert 操作が使用されることを示しています。
USE AdventureWorks2008R2;
GO
SET NOCOUNT ON;
go
SET SHOWPLAN_ALL ON;
GO
DELETE Person.Person WHERE BusinessEntityID = 1209;
GO
SET SHOWPLAN_ALL OFF;
GO
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)
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 操作によって必ずエラーが生成されるように、複数行を返すクエリを意図的に使用しています。クエリ実行プランの出力は、クエリ オプティマイザーでは SELECT ステートメントで指定されたサブクエリが 1 行のみを返すように、Assert 操作が使用されることを示しています。
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
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)
PhysicalOp
-----------------------------------------------------------------------
Assert
Argument
-----------------------------------------------------------------------
WHERE:(CASE WHEN [Expr1007]>(1) THEN (0) ELSE NULL END)