バッチファイルとは、Windows環境で実行できるコマンド列を記述したテキストファイルで、バッチファイルを使うと、データベースに接続してSQL文を実行するだけでなく、そのSQL文の実行結果をファイルに出力することもできる。
今回は、バッチファイルからSQL Serverに接続し、SELECT文を実行した結果をファイルに出力してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事の実装が完了していること。
サンプルプログラムの作成
setting.iniの内容は以下の通りで、前提条件のプログラムと同じ内容で、データベースの接続先などを定義している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ;共通設定ファイル ;DBサーバー名 serverName=localhost ;ユーザー名 userName=USER01 ;パスワード userPass=USER01 ;DB名 dbName=master ;スキーマ名 schemaName=dbo ;様々な文字を含むパラメータ param=!"#$%&'()=-~^|`@{[;]}+<>*/:_?\ |
output_maxid_minid.batの内容は以下の通りで、変数execSqlに定義した2つのSQLを実行し、結果をoutput.log(変数outputFileで定義)に出力している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | @echo off rem 設定ファイル(setting.ini)の設定値を読み込む for /f "tokens=1,* delims==" %%i in (setting.ini) do ( set %%i=%%j ) rem 結果を出力するファイル名 set outputFile=output.log rem user_dataテーブルのid最大値を取得するSQL set execSql=SELECT ISNULL(MAX(id), 0) FROM %schemaName%.user_data rem sqlcmd -S (ホスト名) -U (ユーザー名) -P (パスワード) -d (データベース名) -Q (実行するSQL文) rem 以下のコマンドは1行で記載する必要がある set retVal=sqlcmd -S %serverName% -U %userName% -P %userPass% -d %dbName% -Q "SET NOCOUNT ON; %execSql%" rem select文の実行結果を変数「nowMaxId」に格納 for /f %%i in ('%retVal%') do ( set nowMaxId=%%i ) rem 実行結果をコンソールとファイル(outputFileに指定した値)に出力する関数を呼び出す call:output_result user_dataテーブルのid最大値 maxId %nowMaxId% rem user_dataテーブルのid最小値を取得するSQL set execSql=SELECT ISNULL(Min(id), 0) FROM %schemaName%.user_data rem sqlcmd -S (ホスト名) -U (ユーザー名) -P (パスワード) -d (データベース名) -Q (実行するSQL文) rem 以下のコマンドは1行で記載する必要がある set retVal=sqlcmd -S %serverName% -U %userName% -P %userPass% -d %dbName% -Q "SET NOCOUNT ON; %execSql%" rem select文の実行結果を変数「nowMinId」に格納 for /f %%i in ('%retVal%') do ( set nowMinId=%%i ) rem 実行結果をコンソールとファイル(outputFileに指定した値)に出力する関数を呼び出す call:output_result user_dataテーブルのid最小値 minId %nowMinId% rem 処理を終了する exit /b rem 実行結果をコンソールとファイル(outputFileに指定した値)に出力する関数 :output_result echo *** %1 *** echo 実行SQL: %execSql% echo %2: %3 echo. echo *** %1 *** >> %outputFile% echo 実行SQL: %execSql% >> %outputFile% echo %2: %3 >> %outputFile% echo. >> %outputFile% exit /b |
サンプルプログラムの実行結果
サンプルプログラムの実行結果は、以下の通り。
1) バッチファイルを実行前のデータは、以下の通り。
1 | SELECT * FROM dbo.user_data ORDER BY id ASC |
2) コマンドプロンプトを起動し、バッチファイルが存在するディレクトリ(C:\tmp)に移動し、各ファイルの存在を確認する。
3) バッチファイル(output_maxid_minid.bat)を実行する。実行すると、コマンドプロンプトには以下の値が表示される。
4) バッチ実行後にバッチファイルが存在するディレクトリ(C:\tmp)を確認すると、以下のように、output.log(変数outputFileで定義)が出力されていることが確認できる。
5) output.log(変数outputFileで定義)の中身は以下の通りで、コンソール上と同じ内容が出力されていることが確認できる。
6) user_dataテーブルの内容を、以下のように変更する。
1 | SELECT * FROM dbo.user_data ORDER BY id ASC |
7) バッチファイル(output_maxid_minid.bat)を再度実行する。実行すると、コマンドプロンプトには以下の値が表示される。
8) output.log(変数outputFileで定義)の中身は以下の通りで、コンソール上と同じ内容が追加で出力されていることが確認できる。
要点まとめ
- バッチファイルとは、Windows環境で実行できるコマンド列を記述したテキストファイルで、バッチファイルを使うと、データベースに接続してSQL文を実行するだけでなく、そのSQL文の実行結果をファイルに出力することもできる。
- バッチファイル内で、関数(特定の処理を1つにまとめたもの)を呼び出すこともできる。