A';' はメモリターミネータですが、GOステートメントはバッチターミネータです。
したがって、proc、view、function、またはその他のオブジェクトの作成などのDDL作成を行う場合は、次のような一連の作業を行うことができます。
procblahを....GOとして作成します。
procblah2を....GOとして作成します。
そして、あなたは単一の素晴らしい作成スクリプトを持つことができます。GOがない場合は、「Create(thing)はcreateの最初のステートメントである必要があります...」のように壊れます。これは、SQLが両方に対して単一の操作を実行していると考えたことを意味します。「GO」は、「新しいスコープ、新しいオブジェクト」と言います。だからそれはそれを回避します。パブとNorthwind(古いMSテストデータベース)の作成スクリプトを見ると、それらはすべて単一の「*.sql」ファイルにバッチターミネータを使用していると思います。これにより、1つのファイルで大量の作成が可能になります。
A; ステートメントまでメモリを終了するだけです。ほとんどの場合、それらを省略しても問題ありませんが、SQLの専門家の中には、これから逃れることができないことを知っている大きな場所があります..... CTEです!
はい、CTEは「with」で始まるためすぐに怒鳴りますが、「with」で(nolock)ヒントを使用することもできるため、2つのトランザクションを区別する必要があるため、「;」を使用する必要があります。
例えば:
Select * from table -- standard SQL no biggie
または
Select * from table
Select * from table2 -- these are fine stacked and will run
だが...
Select * from table
with a as (select * from table2) select * from a
'with'のコンテキストが新しいステートメントに変更されたことを知らなかったため、すぐに壊れます。細心の注意を払っている場合の適切なSQLは、次のようになります。
Set NoCount ON; -- No thank you engine I don't need to see counts
Set Transaction Level Isolation Level Read Uncommitted; -- Set me to dirty reads as default
Select
*
from table
;
Select
*
from table2
;
SQLのエンジンはこれを次のように認識します。
NoReadをオンに設定;-カウントを表示する必要がないエンジンに感謝しません\nトランザクションレベルの分離レベルの読み取りをコミット解除に設定します;\n-デフォルトとしてダーティ読み取りに設定します\n\n選択\n*\nテーブルから\n ; \ n\n選択\n*\nテーブル2から\n;
したがって、空白がどこで終了するかを伝える人の助けが少し必要です。そうでなければ、それは人間ではなく、あるステートメントがどこで停止し、別のステートメントがどこから始まったかを知りません。
あなたが他の人のためにそれを書いていて、明確に定義されたガイドラインの下であなたが何をするにしても、私はいつも「;」をするように言われました。それを公式の終了シーケンスにするターミネーター。
GOはバッチターミネータですが、GOを使用してコンテキストを変更できるため、次のようなデータベースの切り替えに役立ちます。
Database1GOを使用する
TableOnDatabase1から*を選択します。
Database2GOを使用する
TableOnDatabase2から*を選択します。
また、スペースを節約するために1行実行しましたが、実際には、メインのSQL構文を別の行で実行し、次のようなサブ構文も実行する必要があります。
Select
ColumnA
, ColumnB
, count(ColumnC) as cnt
From table
Where thing happens
Group by
ColumnA
, ColumnB
Having Count(ColumnC) > 1
Order by ColumnA
一般的な実世界の例の編集:
set nocount on;
declare @Table table ( ints int);
declare @CursorInt int = 1;
while @CursorInt <= 100
begin
insert into @Table values (@CursorInt)
set @CursorInt += 1
End
-- wait a second engine you did not tell me what happened in the 'Messages' section?!
-- aw come on I want to see each transaction!
Set nocount off;
while @CursorInt <= 200
begin
insert into @Table values (@CursorInt)
set @CursorInt += 1
End
-- okay that is annoying I did not have to see 100: "(1 row(s) affected)"
プロシージャのスコープ内で必要なだけメモリターミネータを使用して「nocount」のオンとオフを切り替えることができます。いくつかの挿入を確認し、procで他の挿入を無視したい場合は、常にそれを行います。そして、それらを渡したい場合は、出力変数を設定するか、最終的な行数を単純に選択して返します。