バッチの概要
T-SQL バッチは、1 つの単位としてクライアントによって SQL Server に送信される 1 つ以上の T-SQL ステートメントのコレクションです。 SQL Server は、コードの解析、最適化、実行時に、バッチ内のすべてのステートメントを同時に操作します。
通常、プロシージャではなく SELECT ステートメントを使用してクエリを記述するレポート ライターの場合は、バッチ境界を理解することが重要です。 これらの境界は、ストアド プロシージャやその他のルーチン内の変数とパラメーターの操作に影響します。 たとえば、変数は、参照先と同じバッチで宣言する必要があります。 そのため、バッチに含まれるものを認識することが重要です。
バッチは、クライアント アプリケーションによって区切られます。 バッチの終了をマークする方法は、クライアントの設定によって異なります。 SQL Server Management Studio (SSMS)、Azure Data Studio、SQLCMD を含む Microsoft クライアントの場合、キーワードは GO です。
この例では、それぞれ GO で終了する 2 つの異なるバッチがあります。
CREATE NEW <view_name>
AS ...
GO
CREATE PROCEDURE <procedure_name>
AS ...
GO
バッチ ターミネータ GO は T-SQL キーワードではありませんが、バッチの終了を示すために SSMS によって認識されます。
T-SQL バッチを使用する場合は、次の 2 つの重要な考慮事項に留意してください。
- バッチは変数スコープの境界です。つまり、1 つのバッチで定義された変数は、同じバッチ内の他のコードのみが参照できます
- 一部のステートメント (通常は CREATE VIEW、CREATE FUNCTION、CREATE PROCEDURE などのデータ定義ステートメント) は、同じバッチ内の他のステートメントと組み合わせられない場合があります。
バッチの操作
バッチは、解析と実行のために SQL Server に送信される T-SQL ステートメントのコレクションです。 バッチの解析方法を理解することは、エラー メッセージと動作を識別する場合に役立ちます。 SSMS の [実行] ボタンを押したときなど、クライアントによってバッチが送信されると、SQL Server エンジンによって構文エラーが検出されたバッチが解析されます。 エラーが見つかった場合、バッチ全体が拒否されます。バッチ内でステートメントが部分的に実行されることはありません。
バッチが構文チェックに合格した場合、SQL Server は他の手順を実行し、オブジェクト名の解決、アクセス許可の確認、実行のためのコードの最適化を行います。 このプロセスが完了して実行が開始されると、ステートメントは個別に成功または失敗します。 これは、構文チェックとは対照的に重要です。 1 行でランタイム エラーが発生した場合、コードにエラー処理を追加していない限り、次の行が実行される可能性があります。
たとえば、次のバッチには構文エラーが含まれています。
INSERT INTO dbo.t1 VALUE(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO
次のエラー メッセージが表示されます。
Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'VALUE'.
エラーは 1 行目で発生しましたが、バッチ全体が拒否され、2 行目で実行が続行されません。 各 INSERT ステートメントが反転され、構文エラーが 2 行目で発生した場合でも、バッチ全体が拒否されるため、最初の行は実行されません。
前の例を使用すると、このバッチにエラーは含まれません。
INSERT INTO dbo.t1 VALUES(1,2,N'abc');
INSERT INTO dbo.t1 VALUES(2,3,N'def');
GO
前のサンプルでは、SELECT ステートメントよりも、変更ステートメントをバッチでグループ化する方が一般的であるため、SELECT ではなく INSERT ステートメントを使用しました。