SQL Serverでは、いつGOを使用し、いつセミコロンを使用する必要がありますか?


100

コマンドの後にGOキーワードを使用する必要がある場合、およびコマンドの最後にセミコロンが必要かどうかについて、私は常に混乱していました。違いは何ですか?なぜ/いつ使用する必要がありますか?

SQL Server Management Studioで生成スクリプトを実行すると、セミコロンではなく、どこでもGOが使用されているようです。


回答:


93

GOSSMSにのみ関連します。これは実際のTransact SQLではなく、SSMS GOに個々のバッチのそれぞれの間でSQLステートメントを順番に送信するように指示するだけです。

;SQL文の区切り文字ですが、あなたの文が分割されている場合、ほとんどの部分のためにエンジンが解釈することができます。

主な例外、および;が最も頻繁に使用される場所は、共通テーブル式ステートメントの前です。


5
重視はGOしながら、T-SQL一部ではありません;です
msarchet

2
MERGE文はセミコロンで終了する必要があります。
10

15
更新:SQL Server 2012では、セミコロンを使用しないことは非推奨です。つまり、次のバージョンではセミコロンが必要になります。したがって、移行の際に必要な作業が少ないため(および標準であるため)、セミコロンを使用することをお勧めします。出典:technet.microsoft.com/en-us/library/ms143729.aspxまたはSQL Server 2012の上の本:shop.oreilly.com/product/0790145321978.do
パヴェルBulwan

1
SQL 2014では、次のバージョンで必要となるセミコロンがまだリストされています。いつ廃止されるのかしら。technet.microsoft.com/en-us/library/ms143729.aspx
Frank

2
+ buliは;、非推奨であることを示しておらず、使用しないことは非推奨です。つまり、ソースによれば必須になります。
cjk

78

生成されたDDLスクリプトに非常に多くのGOが表示されるのは、バッチに関する次のルールが原因です。

CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER、およびCREATE VIEWステートメントは、バッチ内で他のステートメントと組み合わせることはできません。CREATEステートメントはバッチを開始する必要があります。そのバッチで続く他のすべてのステートメントは、最初のCREATEステートメントの定義の一部として解釈されます。

生成されたDDLの使用例の1つは、単一のファイルで複数のオブジェクトを生成することです。このため、DDLジェネレーターはバッチを生成できる必要があります。他の人が言ったように、GOステートメントはバッチを終了します。


10
これは、「...いつGOを使用すればよいのか...」と本当に答えた唯一の人です。質問の一部。
Roimer 2013

GOは、SQLを含むオブジェクトを作成するステートメントを終了するように思われます。ステートメントターミネーター。別のDBMSでは、終了文字列を設定する機能を見てきました。たとえば、ステートメントが2つのパイプ文字||で終わるように指定できます。次に、CREATE PROCEDURE ...で終わるSQLを発行できます。... || 二重パイプはCREATE PROCEDUREステートメントを終了します。だから私の質問は、これがMS GOステートメントに類似しているかどうかです。次に、SQLSERVERで終了文字列を再定義できますか?
youcantryreachingme 2018

@youcantryreachingmeこれが2010年に当てはまったかどうかはわかりませんが、可能だと思われます。SSMS:Batch Separatorを参照してください。これの限界が何かは
わかり

34

GO

Goはバッチ区切りです。これは、そのバッチ内のすべてがその特定のバッチに対してローカルであることを意味します。

変数やテーブル変数などの宣言は、GOステートメントを越えて実行されることはありません。

#Tempテーブルは接続に対してローカルであるため、GOステートメントにまたがります。

セミコロン

セミコロンはステートメントの終了文字です。これは、特定のステートメントが終了したことを識別するためだけに使用されます。

ほとんどの場合、ステートメントの構文自体でステートメントの終わりを判断するのに十分です。

ただし、CTEはWITHが最初のステートメントであることを要求するため、WITHの前にセミコロンが必要です。


4
MERGE文はセミコロンで終了する必要があります。
onedaywhen

11

すべてのSQLステートメントを終了するには、セミコロンを使用する必要があります。これは、SQL標準で定義されています。

もちろん、SQL Serverでは多くの場合、ステートメントターミネータを省略できますが、なぜ悪い習慣に陥るのでしょうか。

他の人が指摘したように、共通テーブル式(CTE)の前のステートメントはセミコロンで終了する必要があります。結果として、セミコロンターミネータを完全に採用していない人々からは、次のようになります。

;WITH ...

これは本当に奇妙に見えると思います。貼り付けられるコードの品質がわからない場合は、オンラインフォーラムでは理にかなっていると思います。

さらに、MERGEステートメントはセミコロンで終了する必要があります。ここにパターンが見えますか?これらは、TSQLに新しく追加されたもので、SQL標準に厳密に従っています。SQL Serverチームがセミコロンターミネータの使用を義務付ける道を進んでいるようです。


2
これは本当に奇妙に見えると思います」-私はこれ以上同意できませんでした。など奇妙な質問に、このリード線の一定の繰り返しこのまたは
a_horse_with_no_name

SQL Serverでは、ずさんになることはできません。冗長なステートメントターミネータを省略できます。T-SQLは、他のほとんどのSQLと同様に、純粋な標準SQLではなく、抽象基本クラスのようなものです。DBエンジン自体の方言を支持するために実際には使用されていません。
ProfK

@ProfK:コメントに句読点を含めていただき、特に文章のターミネータ文字が読みやすく理解しやすくなりました。ただし、ハイフンの使用は標準の英語に準拠していません...
ある

8

GOはバッチターミネータで、セミコロンはステートメントターミネータです。

create procはバッチの最初のステートメントである必要があるため、1つのスクリプトに複数のcreate procステートメントを含める場合は、GOを使用します。共通テーブル式を使用する場合、その前のステートメントはセミコロンで終了する必要があります


MERGE文はセミコロンで終了する必要があります。
onedaywhen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.