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から提供されている便利ツールの総称です。

SQL Serverユーティリティ

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」コマンドを理解しようとされていた方の役に立てば幸いです。

本サイトへのご意見、お問い合わせなどありましたらこちらからご連絡下さい。 お問合せフォーム