回答:
GOSSMSにのみ関連します。これは実際のTransact SQLではなく、SSMS GOに個々のバッチのそれぞれの間でSQLステートメントを順番に送信するように指示するだけです。
;SQL文の区切り文字ですが、あなたの文が分割されている場合、ほとんどの部分のためにエンジンが解釈することができます。
主な例外、および;が最も頻繁に使用される場所は、共通テーブル式ステートメントの前です。
GOしながら、T-SQL一部ではありません;です
MERGE文はセミコロンで終了する必要があります。
;、非推奨であることを示しておらず、使用しないことは非推奨です。つまり、ソースによれば必須になります。
生成されたDDLスクリプトに非常に多くのGOが表示されるのは、バッチに関する次のルールが原因です。
CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER、およびCREATE VIEWステートメントは、バッチ内で他のステートメントと組み合わせることはできません。CREATEステートメントはバッチを開始する必要があります。そのバッチで続く他のすべてのステートメントは、最初のCREATEステートメントの定義の一部として解釈されます。
生成されたDDLの使用例の1つは、単一のファイルで複数のオブジェクトを生成することです。このため、DDLジェネレーターはバッチを生成できる必要があります。他の人が言ったように、GOステートメントはバッチを終了します。
Goはバッチ区切りです。これは、そのバッチ内のすべてがその特定のバッチに対してローカルであることを意味します。
変数やテーブル変数などの宣言は、GOステートメントを越えて実行されることはありません。
#Tempテーブルは接続に対してローカルであるため、GOステートメントにまたがります。
セミコロンはステートメントの終了文字です。これは、特定のステートメントが終了したことを識別するためだけに使用されます。
ほとんどの場合、ステートメントの構文自体でステートメントの終わりを判断するのに十分です。
ただし、CTEはWITHが最初のステートメントであることを要求するため、WITHの前にセミコロンが必要です。
MERGE文はセミコロンで終了する必要があります。
すべてのSQLステートメントを終了するには、セミコロンを使用する必要があります。これは、SQL標準で定義されています。
もちろん、SQL Serverでは多くの場合、ステートメントターミネータを省略できますが、なぜ悪い習慣に陥るのでしょうか。
他の人が指摘したように、共通テーブル式(CTE)の前のステートメントはセミコロンで終了する必要があります。結果として、セミコロンターミネータを完全に採用していない人々からは、次のようになります。
;WITH ...
これは本当に奇妙に見えると思います。貼り付けられるコードの品質がわからない場合は、オンラインフォーラムでは理にかなっていると思います。
さらに、MERGEステートメントはセミコロンで終了する必要があります。ここにパターンが見えますか?これらは、TSQLに新しく追加されたもので、SQL標準に厳密に従っています。SQL Serverチームがセミコロンターミネータの使用を義務付ける道を進んでいるようです。
GOはバッチターミネータで、セミコロンはステートメントターミネータです。
create procはバッチの最初のステートメントである必要があるため、1つのスクリプトに複数のcreate procステートメントを含める場合は、GOを使用します。共通テーブル式を使用する場合、その前のステートメントはセミコロンで終了する必要があります
MERGE文はセミコロンで終了する必要があります。