Опис пакетів

Завершено

Пакети T-SQL – це колекції однієї або кількох операторів T-SQL, надісланих клієнту клієнтом як одна одиниця. 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 для аналізу та виконання. Розуміння того, як розподіляються партії, корисне для виявлення повідомлень про помилки та поведінки. Коли пакет надсилає клієнт, наприклад, якщо натиснути кнопку Execute в службі 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 не тому, що модифікаційні оператори частіше групуються у пакети.