Коли в SQL Server слід використовувати GO і коли слід використовувати крапку з двокрапкою;


100

Я завжди плутався з тим, коли мені слід використовувати ключове слово GO після команд і чи потрібна крапка з двокрапкою в кінці команд. У чому полягають відмінності і чому / коли я повинен їх використовувати?

Коли я запускаю сценарій Generate-скрипту в студії управління SQL Server, він, здається, використовує GO повсюди, але не напівкрапку.


Відповіді:


93

GOстосується лише SSMS - він не є власне Transact SQL, він просто повідомляє SSMS надсилати SQL-оператори між кожними GOокремими партіями послідовно.

Це ;розмежувач операторів SQL, але здебільшого двигун може інтерпретувати, де ваші твердження розбиті.

Основний виняток, і місце, де ;найчастіше використовується, є перед загальною таблицею висловлення виразів.



2
MERGEЗаява має бути припинено з коми.
день, коли

15
Оновлення: у SQL Server 2012 НЕ використання крапкових знаків застаріло, тобто вони знадобляться у наступній версії. Тож є хорошою практикою використовувати крапки з комою, оскільки це зажадає менше роботи у разі міграції (і тому, що це стандарт). Джерело: technet.microsoft.com/en-us/library/ms143729.aspx або книга на SQL Server 2012: shop.oreilly.com/product/0790145321978.do
Paweł Bulwan

1
SQL 2014 все ще містить крапки з комою, як потрібно для наступної версії. Цікаво, коли це буде застаріло. technet.microsoft.com/en-us/library/ms143729.aspx
Франк

2
+ buli не заявляє, що ;застаріло, НЕ використовуючи його застаріло, тобто воно стане обов'язковим відповідно до джерела.
cjk

78

Причина, чому ви бачите стільки GO в сценаріях генерованого DDL, полягає в наступному правилі щодо пакетів.

Висловлювання CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER і CREATE VIEW не можуть поєднуватися з іншими операторами в пакетній партії. Оператор CREATE повинен починати пакет. Усі інші твердження, що випливають із цієї партії, будуть інтерпретуватися як частина визначення першого оператора CREATE.

Один із випадків використання для Generated DDL - це генерування декількох об'єктів в одному файлі. Через це генератор DDL повинен бути здатний генерувати партії. Як казали інші, заява GO закінчує партію.


10
Це єдиний, хто дійсно відповів "... коли слід використовувати GO ...?" частина питання.
Роймер

Мені здається, що GO припиняє оператори, які створюють об'єкти, що містять SQL, і які можуть містити; термінатор оператора В іншій СУБД я бачив можливість встановлювати рядок завершення. Наприклад, ви можете вказати, що оператори закінчуються двома символами труб || Потім ви можете видати CREATE PROCEDURE ... багато SQL, що закінчується; ... || і подвійна труба закінчує операцію CREATE PROCEDURE. Отже, моє запитання - чи це аналогічно твердженню MS GO? По-друге, чи можете ви визначити рядок завершення в SQLSERVER?
youcantryreachingme

@youcantryreachingme Я не знаю, чи це було правдою в 2010 році, але здається, що можна. Дивіться SSMS: Batch Separator . Я не впевнений, які межі цього
Конрад Фрікс,

34

ПОВЕРНУТИСЯ

Go - пакетний сепаратор. Це означає, що все в цій партії є локальним саме для цієї партії.

Будь-які декларації змінних, табличних змінних тощо не переходять через GOоператори.

Таблиці #Temp є локальними для з'єднання, тому вони охоплюють оператори GO.

Крапка з комою

Точка з комою - це термінатор операторів. Це суто використовується для виявлення того, що конкретна заява закінчилася.

У більшості випадків самого синтаксису оператора достатньо для визначення кінця висловлювання.

Однак, CTE вимагають, щоб ЗР було першим твердженням, тому вам потрібна крапка з комою перед СВ.


4
MERGEЗаява має бути припинено з коми.
день, коли

11

Ви повинні використовувати крапку з двокрапкою для завершення кожного оператора SQL. Це визначено в стандартах SQL,

Звичайно, частіше за все SQL Server дозволяє опустити термінатор операторів, але навіщо потрапляти в шкідливі звички?

Як зазначали інші, висловлювання, що передує загальному виразу таблиці (CTE), повинно бути закінчене крапкою з двокрапкою. Як наслідок, від людей, які повністю не сприйняли напівкрапковий термінатор, ми бачимо це:

;WITH ...

що мені здається дивним. Я думаю, що це має сенс на інтернет-форумі, коли ви не можете сказати якість коду, в який він буде вставлений.

Крім того, MERGEзаява повинна бути припинена крапкою з комою. Ви бачите тут візерунок? Це кілька нових доповнень до TSQL, які чітко відповідають стандартам SQL. Схоже, команда SQL Server йде по дорозі доручення використання термінатора напівколонки.


2
" що мені здається дивним " - я не міг більше погодитися. І постійне повторення цього призводить до таких дивних питань, як це чи це
a_horse_with_no_name

SQL Server не дозволяє вам бути неохайним - він дозволяє опустити надмірний термінатор оператора; T-SQL, як і більшість інших SQL, не є чистим стандартним SQL, що більше нагадує абстрактний базовий клас - не використовується на практиці на користь власного діалекту двигуна БД.
ПрофК

@ProfK: дякую за включення пунктуаційних знаків у коментар, що полегшує мені читання та розуміння, особливо символи термінатора речення. Хоча ваше використання дефісів не відповідає стандартній англійській мові ...
onedaywhen

8

GO - термінальний пакет, напівкрапка - термінатор заяви.

ви будете використовувати GO, коли ви хочете мати декілька операторів створення Proc в 1 сценарії, оскільки create proc має бути першим оператором у пакеті. Якщо ви використовуєте загальні вирази таблиці, тоді вислів перед ним потрібно закінчити крапкою з двокрапкою


MERGEЗаява має бути припинено з коми.
день, коли
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.