Freigeben über


Assert (Showplanoperator)

Der Assert-Operator überprüft eine Bedingung. Beispielsweise überprüft er die referenzielle Integrität oder er stellt sicher, dass eine skalare Unterabfrage genau eine Zeile zurückgibt. Für jede Eingabezeile wertet der Assert-Operator den Ausdruck in der Argument-Spalte des Ausführungsplans aus. Wird der Ausdruck mit NULL ausgewertet, so wird die Zeile an den Assert-Operator übergeben, und die Ausführung der Abfrage wird fortgesetzt. Wird dieser Ausdruck zu einem Nicht-NULL-Wert ausgewertet, so wird der entsprechende Fehler ausgelöst.

Der Assert-Operator ist ein physischer Operator.

Assert-Operator (Symbol)Symbol im grafischen Ausführungsplan

Beispiele

A. Überprüfen einer CHECK-Einschränkung

Im folgenden Beispiel wird der Wert in der Gender-Spalte für eine angegebene Mitarbeiter-ID in der Employee-Tabelle aktualisiert. In der Tabelle ist eine CHECK-Einschränkung enthalten, mit der die in der Spalte zulässigen Werte auf die Werte 'F' und 'M' eingeschränkt werden. Mit der Ausgabe des Abfrageausführungsplans wird veranschaulicht, dass der Abfrageoptimierer mithilfe des Assert-Operators den in der UPDATE-Anweisung angegebenen Wert gegen die CHECK-Einschränkung abgleicht und einen Fehler ausgibt, wenn die Bedingungen der Einschränkung nicht erfüllt werden.

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

Die Ausführungsplanausgabe des Assert-Operators ist im Folgenden dargestellt.

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. Überprüfen einer FOREIGN KEY-Einschränkung

Im folgenden Beispiel wird eine Zeile der Person.Contact-Tabelle gelöscht. In diesem Fall sind sechs Tabellen mit einem Fremdschlüsselverweis auf die ContactID-Spalte in dieser Tabelle vorhanden. Mit der Ausgabe des Abfrageausführungsplans wird veranschaulicht, dass der Abfrageoptimierer mithilfe des Assert-Operators die DELETE-Anweisung gegen jede dieser Einschränkungen abgleicht.

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

Die Ausführungsplanausgabe des Assert-Operators ist im Folgenden dargestellt.

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. Überprüfen einer skalaren Unterabfrage

Im folgenden Beispiel wird eine Unterabfrage in der WHERE-Klausel der Abfrage verwendet. In diesem Beispiel wird absichtlich eine Unterabfrage verwendet, mit der mehrere Zeilen zurückgegeben werden, damit der Assert-Operator zwingend einen Fehler auslöst. Mit der Ausgabe des Abfrageausführungsplans wird veranschaulicht, dass der Abfrageoptimierer mithilfe des Assert-Operators sicherstellt, dass mit der Unterabfrage, die in der SELECT-Anweisung angegeben ist, nur eine einzelne Zeile zurückgegeben wird.

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

Die Ausführungsplanausgabe des Assert-Operators ist im Folgenden dargestellt.

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

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