バッチファイルとは、Windows環境で実行できるコマンド列を記述したテキストファイルで、バッチファイルを使うと、例えばデータベースに接続して複数のSQL文を実行することができる。
今回は、バッチファイルからSQL Serverに接続し、複数のSQL文を実行してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事のように、A5M2を利用してSQL Serverに接続できていること。
サンプルプログラムの作成
サンプルプログラムの構成は以下の通りで、今回全て新規で作成している。
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=!"#$%&'()=-~^|`@{[;]}+<>*/:_?\ |
select_max_id.sqlの内容は以下の通りで、user_dataテーブルのid最大値を取得するSQLを記載している。
1 2 3 4 5 | -- 「n行処理されました」を表示しないようにする SET NOCOUNT ON; -- user_dataテーブルのid最大値を取得する SELECT ISNULL(MAX(id), 0) FROM $(schema).user_data; |
insert_update.sqlの内容は以下の通りで、user_dataテーブルにデータ追加・データ更新するSQLを記載している。
1 2 3 4 5 6 7 8 9 10 11 12 | -- 「n行処理されました」を表示しないようにする SET NOCOUNT ON; -- user_dataテーブルに1行追加する INSERT INTO $(schema).user_data ( id, name, birth_year, birth_month, birth_day, sex, memo ) VALUES ( CONVERT(int, $(maxId)), N'テスト プリン', 2014, 3, 22, '1', NULL ); -- user_dataテーブルのメモを更新する -- 1つのSQLだけでなく、複数のSQLも、1つのsqlcmdコマンドで実行可能となる UPDATE $(schema).user_data SET memo=N'idが最大値です' WHERE id = CONVERT(int, $(maxId)); UPDATE $(schema).user_data SET memo=NULL WHERE id <> CONVERT(int, $(maxId)); |
call_sqlcmd.batの内容は以下の通りで、setting.iniの内容を読み込み、前述のSQLを呼び出している。
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 | @echo off rem 設定ファイル(setting.ini)の設定値を読み込む for /f "tokens=1,* delims==" %%i in (setting.ini) do ( set %%i=%%j ) rem 設定ファイル内の各設定値を出力 rem 様々な文字を含むパラメータ(param)も問題なく出力している echo *** 設定ファイルから取得したパラメータ値 *** echo serverName: %serverName% echo userName: %userName% echo userPass: %userPass% echo dbName: %dbName% echo schemaName: %schemaName% echo param: %param% echo. rem user_dataテーブルのid最大値を取得する rem sqlcmd -S (ホスト名) -U (ユーザー名) -P (パスワード) -d (データベース名) rem -i (実行するSQLファイルパス) -v (パラメータ) rem その際、スキーマ名をパラメータに渡す rem 以下のコマンドは1行で記載する必要がある set retVal="sqlcmd -S %serverName% -U %userName% -P %userPass% -d %dbName% -i select_max_id.sql -v schema=%schemaName%" rem select文の実行結果を変数「nowMaxId」に格納 for /f %%i in ('%retVal%') do ( set nowMaxId=%%i ) echo *** user_dataテーブルのid最大値 *** echo nowMaxId: %nowMaxId% echo. rem nowMaxIdに1を加算した値をmaxIdに設定する set /a maxId=%nowMaxId%+1 echo *** user_dataテーブルのid最大値+1 *** echo maxId: %maxId% echo. echo *** user_dataテーブルの追加・更新 *** echo user_dataテーブルの追加・更新開始 rem sqlcmd -S (ホスト名) -U (ユーザー名) -P (パスワード) -d (データベース名) rem -i (実行するSQLファイルパス) -v (パラメータ) rem その際、スキーマ名・追加するデータのID(maxId)をパラメータに渡す rem 以下のコマンドは1行で記載する必要がある sqlcmd -S %serverName% -U %userName% -P %userPass% -d %dbName% -i insert_update.sql -v schema=%schemaName% maxId=%maxId% echo user_dataテーブルの追加・更新完了 |
サンプルプログラムの実行結果
サンプルプログラムの実行結果は、以下の通り。
1) バッチファイルを実行前のデータは、以下の通り。
1 | SELECT * FROM dbo.user_data ORDER BY id ASC |
2) コマンドプロンプトを起動し、バッチファイルが存在するディレクトリ(C:\tmp)に移動し、各ファイルの存在を確認する。
3) バッチファイル(call_sqlcmd.bat)を実行する。実行すると、コマンドプロンプトには以下の値が表示される。
4) バッチファイルを1回実行後のデータは以下の通りで、SQLに記載通りに、データを1件追加しmemoの値が更新されていることが確認できる。
1 | SELECT * FROM dbo.user_data ORDER BY id ASC |
5) バッチファイル(call_sqlcmd.bat)を再度実行する。実行すると、コマンドプロンプトには以下の値が表示される。
6) バッチファイルを2回実行後のデータは、以下の通りで、SQLに記載通りに、データを1件追加しmemoの値が更新されていることが確認できる。
1 | SELECT * FROM dbo.user_data ORDER BY id ASC |
要点まとめ
- バッチファイルとは、Windows環境で実行できるコマンド列を記述したテキストファイルで、バッチファイルを使うと、例えばデータベースに接続して複数のSQL文を実行することができる。