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

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

SQL Server には、TransactSQL ステートメントではないものの、sqlcmd ユーティリティ、osql ユーティリティ、および SQL Server Management Studio のコード エディターによって認識されるコマンドがあります。 これらのコマンドを使用すると、バッチおよびスクリプトの読み取りと実行が容易になります。

GO は、Transact-SQL ステートメントのバッチの終了を SQL Server ユーティリティに通知します。

Transact-SQL 構文表記規則

構文

GO [count]  

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

count
正の整数を指定します。 GO の前のバッチが、指定された回数実行されます。

解説

GO は、Transact-SQL ステートメントではありませんが、sqlcmd ユーティリティ、osql ユーティリティ、および SQL Server Management Studio のコード エディターによって認識されるコマンドです。

SQL Server ユーティリティを使用すると、GO は、Transact-SQL の現在のバッチを SQL Server のインスタンスに送信する必要があるシグナルとして解釈されます。 現在のステートメントのバッチは、前回の GO の後に入力されたすべてのステートメントで構成されます。最初の GO の場合、現在のバッチは、アドホック セッションまたはスクリプトの開始後に入力されたすべてのステートメントで構成されます。

Transact-SQL ステートメントを、GO コマンドと同じ行に入力することはできません。 ただし、この行にコメントは入力できます。

ユーザーは、バッチの規則に従う必要があります。 たとえば、バッチの最初のステートメント以降でストアド プロシージャを実行する場合は、バッチに EXECUTE キーワードを含める必要があります。 ローカル (ユーザー定義) 変数のスコープはバッチ内に限られ、GO コマンドの後では参照できません。

USE AdventureWorks2022;  
GO  
DECLARE @MyMsg VARCHAR(50)  
SELECT @MyMsg = 'Hello, World.'  
GO -- @MyMsg is not valid after this GO ends the batch.  
  
-- Yields an error because @MyMsg not declared in this batch.  
PRINT @MyMsg  
GO  
  
SELECT @@VERSION;  
-- Yields an error: Must be EXEC sp_who if not first statement in   
-- batch.  
sp_who  
GO  

SQL Server アプリケーションを使用すると、複数の Transact-SQL ステートメントを SQL Server のインスタンスに送信し、バッチとして実行することができます。 バッチ内のステートメントは、1 つの実行プランにコンパイルされます。 SQL Server ユーティリティでアドホック ステートメントを実行する場合、または SQL Server ユーティリティを介して実行する Transact-SQL ステートメントのスクリプトを作成する場合は、GO を使用して、バッチの終了を通知する必要があります。

ODBC または OLE DB API に基づくアプリケーションで、GO コマンドを実行しようとすると、構文エラーになります。 SQL Server ユーティリティは、サーバーに GO コマンドを送信することはありません。

GO の後、ステートメントのターミネータとしてセミコロンを使用しません。

-- Yields an error because ; is not permitted after GO  
SELECT @@VERSION;  
GO;  

Microsoft Fabric ポータルの SQL クエリ エディターでは、各 SQL ステートメントが独立したセッションとして実行されます。 セッション コンテキストは、異なる SQL ステートメントの間で保持されません。 詳しくは、SQL クエリ エディターに関する記事をご覧ください。

アクセス許可

GO は、権限を必要としないユーティリティ コマンドです。 すべてのユーザーが実行できます。

次の例では、2 つのバッチを作成します。 最初のバッチは、データベース コンテキストを設定する USE AdventureWorks2022 ステートメントのみで構成されます。 その他のステートメントではローカル変数が使用されます。 このため、すべてのローカル変数宣言を 1 つのバッチにまとめる必要があります。 これには、変数を参照する最後のステートメントが実行されてから GO コマンドを実行するようにします。

USE AdventureWorks2022;  
GO  
DECLARE @NmbrPeople INT  
SELECT @NmbrPeople = COUNT(*)  
FROM Person.Person;  
PRINT 'The number of people as of ' +  
      CAST(GETDATE() AS CHAR(20)) + ' is ' +  
      CAST(@NmbrPeople AS CHAR(10));  
GO  

次の例では、バッチ内のステートメントを 2 回実行します。

SELECT DB_NAME();  
SELECT USER_NAME();  
GO 2