SQL ServerのGOとは? 必要性と使い方について紹介
はじめに
MicorsoftのSQL Serverを運用していると、GO
という記述を見かけることがあるかと思います。
GO
のMicrosoftの公式サイトの解説だと意味が分かりづら行く、どういったケースで使うものなのか、理解が難しいという方もいらっしゃるのではないかと思います。
この記事では、GO
の使い方について紹介します。
GOはSQL文ではなく、SQL Server用のコマンド
GO は、SQL 文ではなく、バッチ(一連の処理をまとめたもの)の終了を SQL Server ユーティリティに通知するためのSQL Server専用のコマンドです。
-- バッチ1開始
SELECT @@VERSION;
GO
-- バッチ1終了
-- バッチ2開始
SELECT USER_NAME();
SELECT DB_NAME();
GO
-- バッチ2終了
SQL Server ユーティリティとは
SQL Server ユーティリティは、sqlcmd ユーティリティ、osql ユーティリティ、および SQL Server Management Studio などのMicrosoftから提供されている便利ツールの総称です。
GOコマンドの構文
GOはGO [count]
のような形式で指定します。
countには正の整数を指定します。
GOの前のバッチが、指定された回数実行されます。
countは省略可能で、省略した場合は1回だけ実行されます。
-- 直前のSQLを3回実行
SELECT @@VERSION;
GO 3
-- 省略した場合は1回実行
SELECT USER_NAME();
SELECT DB_NAME();
GO
GO
は、SQL句と異なり、終了端子としてセミコロンを使用することはできません。
--セミコロンを使用することはできません。
SELECT @@VERSION;
GO;
GO
を使う際の注意点として、GO
を使うと、変数はリセットされる、それ以降のバッチでは利用できなくなるという点です。
以下の例では、@var001
という変数はバッチ1では利用できますが、バッチ2では未定義のため、エラーになります。
-- バッチ1
DECLARE @var001 VARCHAR(50)
SELECT @var001 = 'test'
PRINT @var001
GO
-- バッチ2 エラー
PRINT @var001
GO
GOのユースケース
GO
コマンドの構文について、ご理解いただけと思うので、次はGOのユースケースについて紹介します。
複数回同じSQLを実行する場合
先程、解説したようにGO
の後に、整数を指定することで、複数回同じ処理を記載することができます。
複数回同じSQLを実行する場合、GOコマンドを使うことができます。
ただ、この使い方をするのは、稀で、あまり見かけることはありません。
SELECT DB_NAME();
GO 2
バッチの最初に記載する必要があるSQL句を利用する場合
CREATE PROCEDURE
など一部のSQL句はバッチの先頭に記載しなければならないというルールがあります。
上記のようなクエリを使う場合は、以下のようにGOコマンドを記載する必要があります。
--- GOコマンドを使わないケース -→ エラーになる
USE [DB_001]
CREATE PROCEDURE p001 AS SELECT 'procedure001'
CREATE PROCEDURE p002 AS SELECT 'procedure002'
--- GOコマンドを使うケース -→ エラーにならない
USE [DB_001]
GO
CREATE PROCEDURE p001 AS SELECT 'procedure001'
GO
CREATE PROCEDURE p002 AS SELECT 'procedure002'
処理時間が長い処理を実行する場合
異なる長い処理を複数回、実行したい場合、GO
で処理を区切ると、GO
ごとにコミットが行われるので、
一部のバッチがエラー終了した場合でも、エラーが出る前に実行されていたバッチはコミット済みなので、
再実行が不要になります。
--- バッチ1
BULK INSERT [TEST_TABLE_001]
FROM 'C:\work\BULK_001.csv'
WITH (FIELDTERMINATOR =',')
GO
-- バッチ2
BULK INSERT [TEST_TABLE_002]
FROM 'C:\work\BULK_002.csv'
WITH (FIELDTERMINATOR =',')
GO
-- バッチ3
BULK INSERT [TEST_TABLE_003]
FROM 'C:\work\BULK_003.csv'
WITH (FIELDTERMINATOR =',')
おわりに
この記事では、「GO」コマンドについてを紹介しました。
- GOはSQL文ではなく、バッチの終了を示すSQL Server専用のコマンド
- GOのユースケースは、
- 複数回同じSQLを実行する場合
- バッチの最初に記載する必要があるSQL句を利用する場合
- 処理時間が長い処理を実行する場合
この記事が、これから「GO」コマンドを理解しようとされていた方の役に立てば幸いです。
本サイトへのご意見、お問い合わせなどありましたらこちらからご連絡下さい。 お問合せフォーム