Compartilhar via


Operador de plano de execução Assert

O operador Assert verifica uma condição. Por exemplo, ele valida integridade referencial ou assegura que uma subconsulta escalar retorne uma linha. Para cada linha de entrada, o operador Assert avalia a expressão na coluna Argumento do plano de execução. Se essa expressão for avaliada como NULL, a linha será passada pelo operador Assert e a execução de consulta continuará. Se essa expressão for avaliada como um valor não nulo, será gerado um erro apropriado.

O operador Assert é um operador físico.

Ícone do operador AssertÍcone de plano de execução gráfica

Exemplos

A. Validando uma restrição CHECK

O exemplo a seguir atualiza o valor na coluna Gender para uma ID de um funcionário especificado na tabelaEmployee. A tabela tem uma restrição CHECK que limita os valores permitidos na coluna aos valores 'F' e 'M’. A saída do plano de execução de consulta mostra que o otimizador de consulta usa o operador Assert para validar o valor especificado na instrução UPDATE em relação à restrição CHECK e gera um erro quando as condições da restrição não são atendidas.

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

A saída do plano de execução do operador Assert é exibida abaixo.

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. Validando uma restrição FOREIGN KEY

O exemplo a seguir exclui uma linha da tabela Person.Contact. Nesse caso, há seis tabelas com uma referência de chave estrangeira para a coluna ContactID nessa tabela. A saída do plano de execução de consulta mostra que o otimizador de consulta usa o operador Assert para validar a instrução DELETE em relação a cada uma dessas restrições.

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

A saída do plano de execução do operador Assert é exibida abaixo.

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. Validando uma subconsulta escalar

O exemplo a seguir usa uma subconsulta na cláusula da consulta WHERE. Esse exemplo usa, intencionalmente, uma subconsulta que retorna várias linhas para forçar o operador Assert a gerar um erro. A saída do plano de execução de consulta mostra que o otimizador de consulta usa o operador Assert para assegurar que a subconsulta especificada na instrução SELECT retornará uma única linha.

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

A saída do plano de execução do operador Assert é exibida abaixo.

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

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