バッチ

バッチとは、SQL Server で実行するためにアプリケーションから同時に送信する 1 つ以上の Transact-SQL ステートメントをグループにしたものです。SQL Server では、バッチのステートメントが 1 つの実行単位 (実行プラン) にコンパイルされます。実行プランの中のステートメントは一度に 1 つずつ実行されます。

各 Transact-SQL ステートメントは、セミコロンで終了する必要があります。この要件は強制ではありませんが、セミコロンなしでステートメントを終了する機能は推奨されず、Microsoft SQL Server の将来のバージョンでは削除される可能性があります。

構文エラーなどのコンパイル エラーが発生すると、実行プランのコンパイルが停止します。したがって、バッチ内のステートメントは一切実行されません。

算術オーバーフロー、制約違反などのランタイム エラーが発生すると、次のいずれかの影響が現れます。

  • ほとんどのランタイム エラーでは現在のステートメントが停止し、バッチ内のそのステートメント以降のステートメントは実行されません。

  • 制約違反など、一部のランタイム エラーでは、現在のステートメントのみが停止します。バッチ内の残りのステートメントはすべて実行されます。

ランタイム エラーが発生したステートメントよりも前に実行されたステートメントは影響を受けません。ただし、バッチがトランザクション内で実行され、発生したエラーによってトランザクションがロールバックされる場合は例外です。その際は、ランタイム エラーが発生する前のコミットされていないデータ変更がロールバックされます。

たとえば、バッチ内に 10 個のステートメントがあるとします。5 番目のステートメントに構文エラーがある場合は、バッチ内のどのステートメントも実行されません。バッチがコンパイルされ、実行中に 2 番目のステートメントが失敗した場合は、最初のステートメントは実行済みであるため、そのステートメントの結果は影響を受けません。

SQL Server では、ステートメントレベルの再コンパイルを実行できます。つまり、あるステートメントが原因で再コンパイルが実行された場合、そのステートメントのみが再コンパイルされ、バッチ全体は再コンパイルされません。この動作は SQL Server 2000 とは異なります。同じバッチ内に 1 つの CREATE TABLE ステートメントと 4 つの INSERT ステートメントを含む、次のような例について考えてみましょう。

CREATE TABLE dbo.t3(a int) ;
INSERT INTO dbo.t3 VALUES (1) ;
INSERT INTO dbo.t3 VALUES (1,1) ;
INSERT INTO dbo.t3 VALUES (3) ;
GO

SELECT * FROM dbo.t3 ;

まず、バッチがコンパイルされます。CREATE TABLE ステートメントはコンパイルされますが、dbo.t3 テーブルがまだ存在していないため、INSERT ステートメントはコンパイルされません。

次に、バッチの実行が開始されます。テーブルが作成されます。最初の INSERT がコンパイルされ、直ちに実行されます。この時点でテーブルに含まれる行は 1 つです。次に、2 番目の INSERT ステートメントがコンパイルされます。コンパイルが失敗し、バッチが終了します。SELECT ステートメントは 1 行を返します。

SQL Server 2000 では、バッチの実行が開始されて、テーブルが作成されます。3 つの INSERT ステートメントが 1 つずつコンパイルされますが、これらのステートメントは実行されません。2 番目の INSERT でコンパイル エラーが発生したため、バッチ全体が終了します。SELECT ステートメントは行を返しません。

バッチの使用に関するルール

バッチの使用には、次のルールが適用されます。

  • バッチでは CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE SCHEMA、CREATE TRIGGER、および CREATE VIEW の各ステートメントを他のステートメントと組み合わせて使用することはできません。CREATE ステートメントはバッチの最初に記述する必要があります。そのバッチの CREATE 以降のステートメントはすべて、CREATE ステートメントの定義の一部として解釈されます。

  • テーブルを変更してから、同じバッチの中で新しい列を参照することはできません。

  • EXECUTE ステートメントがバッチ内の最初のステートメントである場合、EXECUTE キーワードは不要です。EXECUTE ステートメントがバッチ内の最初のステートメントではない場合、EXECUTE キーワードが必要です。

重要な注意事項重要

バッチ ファイルには資格情報をプレーン テキストで記述できます。資格情報は、バッチの実行中にユーザーの画面に表示することも可能です。