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 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)