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

Завершено

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

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

Пакеты определяются клиентским приложением. Как пометить конец пакета, зависит от параметров клиента. Для клиентов Microsoft, включая SQL Server Management Studio (SSMS) и 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, потому что инструкции изменения чаще всего объединяются в пакеты.