Описание пакетов
Пакеты 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, потому что инструкции изменения чаще всего объединяются в пакеты.