Описание пакетов
Пакеты 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.