SQL Serverのバッチについて調べたことをまとめておこうと思います。
SQL Serverのバッチとは?
SQL Serverのバッチとは、SQL Serverに対してまとめて処理させたいステートメントの塊のことです。バッチの中に複数のステートメントを入れて、その複数のステートメントをグループ化することができます。
これだけでは、意味が分かりませんよね。。まずはわかりやすい例として、ローカル変数の定義で確認してみます。
Transact-SQLのローカル変数は、この「バッチ」という範囲内でのみ有効になります。実際にSSMSを使って、それを確認してみましょう。
SSMSでは、このクエリエディターに記述したすべてのステートメントが1つのバッチとして扱われます。以下では、ローカル変数を定義しそれを検索するという特になんでもない処理です。ローカル変数の値を正しく参照して、検索することができています。
それでは、SELECT文のみを選択して実行してみましょう。変数を定義してくださいというエラーになりました。実はこのように、SSMSのクエリエディターで選択した状態で実行すると、その選択した部分がバッチとして扱われます。
選択した部分にはローカル変数の定義がないため、エラーになったということです。
また、このバッチを区切るための構文として「GO」があります。
SQL Server のユーティリティのステートメント - GO - SQL Server | Microsoft Docs
これは、バッチを区切る効果があります。さきほどのクエリで、ローカル変数の定義とSELECT文の間に「GO」を入れて実行してみましょう。
SELECT文がエラーになりました。ローカル変数定義とSELECT文がGOで区切られているので、それぞれバッチの範囲が分かれているため、ローカル変数が参照できずエラーとなったということです。
バッチの先頭に記述する必要があるステートメント
簡単にバッチについて確認してきました。補足として、実はバッチの先頭に記述しないとエラーになるステートメントがいくつかあります。これは知らなかったので、やや驚きました。いくつか紹介します。
- CREATE PROCEDURE
- CREATE VIEW
- CREATE FUNCTION
- CREATE TRIGGER
CREATE VIEWで実際にエラーになるか確認してみましょう。SELECT文がバッチの先頭にあるので、以下のとおりエラーになりました。
先頭のSELECT文をコメントアウトして、再度実行すると成功しました。
補足
ちなみに、補足としてこのバッチ「GO」という識別子は変更することができます。SSMSで変更するには、「ツール」-「オプション」を選択します。オプションの「クエリ実行」を選択すると、設定欄の中にバッチ区切り記号があります。現在は、「GO」になっていますがここを任意の値にすることでバッチ区切り文字が変更できます。
まあ、まず変更することはないと思いますが。。。
おわりに
いかがでしたでしょうか。ときどき参考書やSQL Server関連のWebページでさらっと言葉として出てくるバッチを簡単に紹介しました。
知らなくても問題ないかもしれませんが、色々と細かいところで出てくるので知っておいたほうが良さそうですね。
最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。