Оператор Assert инструкции Showplan

Оператор Assert проверяет условие. Например, этот оператор проверяет целостность ссылок или гарантирует, что скалярный вложенный запрос возвращает одну строку. Для каждой входной строки оператор Assert вычисляет выражение в столбце Аргумент плана выполнения. Если значением этого выражения является NULL, строка передается через оператор Assert и выполнение запроса продолжается. При значении этого выражения, отличном от NULL, будет выдана соответствующая ошибка.

Assert является физическим оператором.

Значок оператора AssertЗначок графических планов выполнения

Примеры

А. Проверка ограничения CHECK

В следующем примере обновляется значение в столбце Gender для заданного идентификатора служащего в таблице Employee. В таблице имеется ограничение CHECK, устанавливающее в качестве допустимых значений для столбца «F» и «M». Выходные данные плана выполнения запроса показывают, что оптимизатор запросов использует оператор Assert для сравнения значения, заданного в инструкции UPDATE, с ограничением CHECK и формирует ошибку, если условия ограничения не соблюдаются.

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

Ниже приводятся выходные данные плана выполнения оператора Assert.

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)

Б. Проверка ограничения FOREIGN KEY

Следующий пример удаляет строку из таблицы Person.Person. В этом случае имеется шесть таблиц, содержащих ссылки внешнего ключа к столбцу BusinessEntityID в этой таблице. Выходные данные плана выполнения запроса показывают, что оптимизатор запросов использует оператор Assert для сравнения инструкции DELETE с каждым ограничением.

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

Ниже приводятся выходные данные плана выполнения оператора Assert.

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)

В. Проверка скалярного вложенного запроса

В следующем примере в предложении WHERE запроса используется вложенный запрос. Этот запрос намеренно использует вложенный запрос, возвращающий несколько строк, чтобы оператор Assert сформировал ошибку. Выходные данные плана выполнения запроса показывают, что оптимизатор запросов использует оператор Assert для проверки и подтверждения того, что вложенный запрос, заданный в инструкции SELECT возвращает только одну строку.

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

Ниже приводятся выходные данные плана выполнения оператора Assert.

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

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