Condividi tramite


Operatore Showplan Assert

L'operatore Assert verifica una condizione, ad esempio convalida l'integrità referenziale oppure verifica che una subquery scalare restituisca una riga. Per ogni riga di input, l'operatore Assert valuta l'espressione nella colonna Argument del piano di esecuzione. Se questa espressione restituisce NULL, la riga viene passata tramite l'operatore Assert e l'esecuzione della query procede. Se l'operazione restituisce un valore non NULL, verrà generato l'errore appropriato.

Assert è un operatore fisico.

Icona dell'operatore AssertIcona del piano di esecuzione grafico

Esempi

A. Convalida di un vincolo CHECK

Nell'esempio seguente viene aggiornato il valore della colonna Gender per un ID di dipendente specificato nella tabella Employee. La tabella include un vincolo CHECK che limita i valori consentiti nella colonna ai valori 'F' e 'M'. L'output del piano di esecuzione della query mostra che Query Optimizer utilizza l'operatore Assert per convalidare il valore specificato nell'istruzione UPDATE per il vincolo CHECK e genera un errore quando le condizioni del vincolo non vengono soddisfatte.

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

L'output del piano di esecuzione dell'operatore Assert è il seguente.

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. Convalida di un vincolo FOREIGN KEY

Nell'esempio seguente viene eliminata una riga dalla tabella Person.Contact. Esistono sei tabelle con un riferimento di chiave esterna alla colonna ContactID di questa tabella. L'output del piano di esecuzione della query mostra che Query Optimizer utilizza l'operatore Assert per convalidare l'istruzione DELETE per ogni vincolo.

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

L'output del piano di esecuzione dell'operatore Assert è il seguente.

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. Convalida di una subquery scalare

Nell'esempio seguente viene utilizzata una subquery nella clausola WHERE della query. Viene utilizzata intenzionalmente una subquery che restituisce più righe per forzare l'operatore Assert a generare un errore. L'output del piano di esecuzione della query mostra che Query Optimizer utilizza l'operatore Assert per assicurare che la subquery specificata nell'istruzione SELECT restituisca solo una riga singola.

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

L'output del piano di esecuzione dell'operatore Assert è il seguente.

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

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