セージ の メモ書き

メモこそ命の恩人だ

SQL Server - ステートメント/バッチ/GO(区切り記号)

ステートメント

; Transact-SQL ステートメントの終端記号。 セミコロンは、このバージョンの SQL Server のほとんどのステートメントでは必須ではありませんが、将来のバージョンでは必須になる予定です。


バッチ

バッチ | Microsoft Learn

  • 1つ以上のステートメントをグループ化したものである。
  • 実行プランは、バッチ単位で登録される。

GO

SQL Server のユーティリティのステートメント - GO - SQL Server | Microsoft Learn

  • バッチ区切り記号。
  • "GO" までのステートメントをバッチにする。
  • SSMS で "GO" を変更することもできる。
    • "ツール→オプション→クエリ実行→SQL Server→全般" より...
    • "バッチ区切り記号" の文字列で変更できる。
  • "GO" がない場合、T-SQL の最後に自動付与される動作となる。
  • "GO 数値" で指定回数のバッチを実行できる。
  • 注意
    • GO の後、それまで定義した変数は参照できない。
    • GO にセミコロンは付与できない。
    • GO とトランザクションは関係ない。GO はバッチの指定。

こんな感じ。

USE SampleDB;

-- テーブル削除
IF ObJECt_ID('[Person]') IS NOT NULL DROP TABLE Person;

-- テーブル追加
CREATE TABLE Person
(
    [Id] int NOT NULL IDENTITY,
    [Name] nvarchar(50),
    PRIMARY KEY ([Id])
);

GO 

-- データ追加
INSERT INTO Person ([Name]) VALUES ('なまえ');

GO 2

-- データ抽出
SELECT * FROM Person;

-- INSERT前にGOコマンドを実行したため、INSERT後のGOコマンドで2レコードのデータが挿入されたことを確認。
-- INSERT前のGOコマンドを除外した場合、DROP TABLEも実行されるため、1レコードのデータが挿入されたことを確認。


実験

実行プランへのキャッシュ

  • GO で分割してキャッシュされるか確認。

まず、以下でプランキャッシュを削除。

DBCC FREEPROCCACHE;
SELECT text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle);
GO

次に、以下で GO の部分で分割されることを確認。

USE SampleDb;
GO
SELECT TOP 1 * FROM SampleTable1;
SELECT TOP 2 * FROM SampleTable1;
GO
SELECT TOP 3 * FROM SampleTable1;
GO
SELECT text FROM sys.dm_exec_cached_plans CROSS APPLY sys.dm_exec_sql_text(plan_handle);



以上