Який сенс мати сепаратор партії?
Ознайомившись із багатьма відповідями та надавши коментарі, ось що я думаю.
Справжнє запитання: "Який сенс мати партію?"
Існує 2 наслідки пакетування, які мають певне значення, і існує додаткове використання, go
яке може бути корисним:
1. Усі твердження в пакеті складаються в єдиний план виконання
Як це впливає на вас, як розробника SQL, я не знаю. Але воно є. Наслідком цього є те, що ви не можете мати деякі оператори в одній партії . Наприклад, ви не ALTER
можете таблицю, щоб додати стовпець, а потім select
цей стовпець у тій самій партії - оскільки під час складання плану виконання цей стовпець не існує для вибору.
Я думаю, що є відкритий аргумент щодо того, чи повинен SQL Server самостійно виявляти це, не вимагаючи від розробників включати go
оператори у свої сценарії. Крім того, у документах сказано, що з'єднання ODBC можуть ніколи не видавати go
команду. Це не для мене ясно , як сценарій запуску через ODBC буде вести себе , якщо він включений в ALTER
/ SELECT
приклад просто дав.
2. Локально оголошені змінні існують лише в межах групи, в якій вони були оголошені
Ці два моменти поєднували своєрідний відстій. У мене є сценарій, який створює та змінює структури БД (таблиці, процедури тощо), і я хочу оголосити змінні на початку сценарію, які будуть використовуватися для управління поведінкою сценарію загалом. Як тільки мені потрібно завершити пакет (через, скажімо, ALTER
твердження - див. Мій пункт 1 вище), ці змінні "config" виходять за межі області застосування і не можуть бути використані далі в сценарії. Моє обхідне рішення - створити таблицю, зберегти конфігураційні змінні в таблиці, потім прочитати з цієї таблиці весь мій сценарій, а потім опустити таблицю в кінці (на випадок, якщо хтось інший стикається з цим).
Цей другий підтекст насправді можна використати з перевагою - якщо ваш скрипт виконує багато роботи, і ви просто хочете очистити всі свої локальні змінні, ви можете просто включити GO
оператор, а потім оголосити нові змінні (тобто. І повторно використовувати ті самі імена, якщо це те, що ви хочете).
3. GO має необов'язковий параметр (з назвою "count"), який повідомляє серверу повторювати пакетні дії кілька разів
Це використання видається приємною додатковою функціональністю, доданою до GO
виписки. Я вважаю, що початкова або основна функція GO
більше стосується компіляції єдиного плану виконання, як згадувалося в пункті 1 - інакше ключове слово також може бути чимось подібним REPEAT 10
- але повторити що? Партія. Без GO
позначення партії, команда повторення може лише колись повторити попередній окремий вираз. Тому GO
це хороший спосіб повторити партії .
Довідково
Все це відбувається завдяки спробі зрозуміти документацію MS про GO . Багато інших відповідей - і тут, і на інші питання - вибирайте фрагменти документації, але я думаю, що сама документація не може по-справжньому пояснити, чому в першу чергу користь від пакетування - звідси мій внесок у вже добре прокоментований питання.
Додаток
Написавши вище, я знайшов Правила використання пакетів, згадані Microsoft у GO
документації. На пов’язаній сторінці пояснюється, що план виконання складається з декількох тверджень. У ньому також сказано, що окремі оператори можуть бути повторно скомпільовані в новий план виконання (тобто за допомогою SQL Server під час автоматичної обробки пакета). Так, наприклад, після заяви до CREATE TABLE
вас, можливо, ви INSERT
потрапите в цю таблицю. Цей INSERT
оператор буде перекомпільовано після того, як таблиця буде створена в попередньому операторі.
Це зміцнює думку про те, що SQL Server, ймовірно, може виявити ті сценарії, коли ALTER
за таблицею слідує a, SELECT
і що йому потрібно повторно скомпілювати SELECT
(див. Мій пункт 1 вище), і, можливо, це саме те, що відбувається, якщо використовується ODBC (див. пункт 1 вище).
Жодна з цих нових відомостей не змінює 3 пункти, наведені вище. Посилання, яке я щойно дав, містить додаткове прочитання і закінчується "правилами", а саме:
Оператори CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE SCHEMA, CREATE TRIGGER і CREATE VIEW не можуть поєднуватися з іншими операторами в пакеті. Оператор CREATE повинен починати пакет. Усі інші твердження, що випливають із цієї групи, будуть інтерпретовані як частина визначення першого оператора CREATE.
Таблицю не можна змінити, а потім нові стовпці, на які посилаються в тому ж пакеті.
Якщо оператор EXECUTE є першим оператором у пакеті, ключове слово EXECUTE не потрібно. Ключове слово EXECUTE потрібно, якщо оператор EXECUTE не є першим оператором у пакеті.