Condividi tramite


Operatore Showplan Assert

L'operatore Assert verifica una condizione, ad esempio convalida l'integrità referenziale oppure verifica che una sottoquery 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 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

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

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

Nell'esempio seguente viene eliminata una riga dalla tabella Person.Person. Esistono sei tabelle con un riferimento di chiave esterna alla colonna BusinessEntityID 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 AdventureWorks2008R2;
GO
SET NOCOUNT ON;
go
SET SHOWPLAN_ALL ON;
GO
DELETE Person.Person WHERE BusinessEntityID = 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 sottoquery scalare

Nell'esempio seguente viene utilizzata una sottoquery nella clausola WHERE della query. Viene utilizzata intenzionalmente una sottoquery 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 sottoquery specificata nell'istruzione SELECT restituisca solo una riga singola.

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

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

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

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