Описание пакетов

Завершено

Пакеты T-SQL — это коллекции одной или нескольких инструкций T-SQL, которые отправляются в SQL Server клиентом в виде одной единицы. SQL Server работает со всеми инструкциями в пакете одновременно при анализе, оптимизации и выполнении кода.

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

Пакеты определяются клиентским приложением. Как пометить конец пакета, зависит от параметров клиента. Для клиентов Майкрософт, включая SQL Server Management Studio (SSMS), Azure Data Studio и SQLCMD, ключевое слово — GO.

В этом примере существует два разных пакета, которые завершаются с помощью GO:

CREATE NEW <view_name>
AS ...
GO
CREATE PROCEDURE <procedure_name>
AS ...
GO

Пакетный терминатор GO не является ключевым словом T-SQL, но SSMS распознает его для указания конца пакета.

При работе с пакетами T-SQL следует учитывать два важных вопроса:

  • Пакеты являются границами для области переменных, что означает, что переменная, определенная в одном пакете, может ссылаться только на другой код в том же пакете.
  • Некоторые инструкции, как правило, инструкции определения данных, такие как CREATE VIEW, CREATE FUNCTION и CREATE PROCEDURE, могут не сочетаться с другими в одном пакете.

Работа с пакетами

Пакет — это коллекция инструкций T-SQL, отправленных в SQL Server для синтаксического анализа и выполнения. Понимание того, как обрабатываются пакеты, будет полезно при выявлении сообщений об ошибках и анализе поведения. При отправке пакета клиентом, например при нажатии кнопки "Выполнить" в SSMS, пакет анализируется для синтаксической ошибки подсистемы SQL Server. Все обнаруженные ошибки приводят к отклонению всего пакета; В пакете не будет частичного выполнения инструкций.

Если пакет проходит проверку синтаксиса, SQL Server выполняет другие действия, разрешая имена объектов, проверяя разрешения и оптимизируя код для выполнения. После завершения этого процесса и начала выполнения инструкции выполняются успешно или заканчиваются сбоем по отдельности. Это важное отличие от проверки синтаксиса. При возникновении ошибки среды выполнения в одной строке может выполняться следующая строка, если в код не добавлена обработка ошибок.

Например, следующий пакет содержит синтаксическую ошибку:

INSERT INTO dbo.t1 VALUE(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO

Это сообщение об ошибке:

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'VALUE'.

Ошибка произошла в строке 1, но весь пакет отклонен, и выполнение не продолжается с строкой 2. Даже если каждая из инструкций INSERT была отменена и синтаксическая ошибка произошла во второй строке, первая строка не будет выполнена, так как весь пакет будет отклонен.

В предыдущем примере этот пакет не содержит ошибки:

INSERT INTO dbo.t1 VALUES(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO

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