Compartir a través de


Assert (operador de Showplan)

El operador Assert comprueba una condición. Por ejemplo, valida la integridad referencial o se asegura de que una subconsulta escalar devuelve una fila. Por cada fila de entrada, el operador Assert evalúa la expresión de la columna Argument del plan de ejecución. Si la expresión da como resultado NULL, la fila se pasa a través del operador Assert y continúa la ejecución de la consulta. Si la expresión da como resultado un valor distinto a NULL, se generará el error apropiado.

Assert es un operador físico.

Icono del operador AssertIcono del plan de ejecución gráfico

Ejemplos

A. Validar una restricción CHECK

En el ejemplo siguiente se actualiza el valor de la columna Gender para un Id. de empleado concreto de la tabla Employee. La tabla tiene una restricción CHECK que limita los valores aceptados en la columna a los valores "F" y "M". La salida del plan de ejecución de consulta muestra que el optimizador de consultas usa el operador Assert para validar el valor especificado en la instrucción UPDATE respecto a la restricción CHECK y genera un error si no se cumplen las condiciones de la restricción.

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

La salida del plan de ejecución del operador Assert se muestra a continuación.

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. Validar una restricción FOREIGN KEY

En el ejemplo siguiente se elimina una fila de la tabla Person.Person. En este caso, hay seis tablas que tienen una referencia de clave externa a la columna BusinessEntityID de esta tabla. La salida del plan de ejecución de consultas muestra que el optimizador de consultas utiliza el operador Assert para validar la instrucción DELETE respecto a cada una de estas restricciones.

USE AdventureWorks2008R2;
GO
SET NOCOUNT ON;
go
SET SHOWPLAN_ALL ON;
GO
DELETE Person.Person WHERE BusinessEntityID = 1209;
GO
SET SHOWPLAN_ALL OFF;
GO

La salida del plan de ejecución del operador Assert se muestra a continuación.

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. Validar una subconsulta escalar

En el ejemplo siguiente se usa una subconsulta en la cláusula WHERE de la consulta. En este ejemplo se usa deliberadamente una subconsulta que devuelve varias filas para hacer que el operador Assert genere un error. La salida del plan de ejecución de consultas muestra que el optimizador de consultas usa el operador Assert para asegurarse de que la subconsulta especificada en la instrucción SELECT devuelva una sola fila.

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

La salida del plan de ejecución del operador Assert se muestra a continuación.

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

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