バッチファイルとは、Windows環境で実行できるコマンド列を記述したテキストファイルで、バッチファイルを使うと、例えばデータベースに接続して複数のSQL文を実行することができる。
今回は、バッチファイルからSQL Serverに接続し、複数のSQL文を実行してみたので、そのサンプルプログラムを共有する。
前提条件
下記記事のように、A5M2を利用してSQL Serverに接続できていること。
サンプルプログラムの作成
サンプルプログラムの構成は以下の通りで、今回全て新規で作成している。

setting.iniの内容は以下の通りで、データベースの接続先などを定義している。
;共通設定ファイル
;DBサーバー名
serverName=localhost
;ユーザー名
userName=USER01
;パスワード
userPass=USER01
;DB名
dbName=master
;スキーマ名
schemaName=dbo
;様々な文字を含むパラメータ
param=!"#$%&'()=-~^|\`@{[;]}+<>*/:_?\select_max_id.sqlの内容は以下の通りで、user_dataテーブルのid最大値を取得するSQLを記載している。
-- 「n行処理されました」を表示しないようにする SET NOCOUNT ON; -- user_dataテーブルのid最大値を取得する SELECT ISNULL(MAX(id), 0) FROM $(schema).user_data;
insert_update.sqlの内容は以下の通りで、user_dataテーブルにデータ追加・データ更新するSQLを記載している。
-- 「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を呼び出している。
@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) バッチファイルを実行前のデータは、以下の通り。
SELECT * FROM dbo.user_data ORDER BY id ASC

2) コマンドプロンプトを起動し、バッチファイルが存在するディレクトリ(C:\tmp)に移動し、各ファイルの存在を確認する。

3) バッチファイル(call_sqlcmd.bat)を実行する。実行すると、コマンドプロンプトには以下の値が表示される。

4) バッチファイルを1回実行後のデータは以下の通りで、SQLに記載通りに、データを1件追加しmemoの値が更新されていることが確認できる。
SELECT * FROM dbo.user_data ORDER BY id ASC

5) バッチファイル(call_sqlcmd.bat)を再度実行する。実行すると、コマンドプロンプトには以下の値が表示される。

6) バッチファイルを2回実行後のデータは、以下の通りで、SQLに記載通りに、データを1件追加しmemoの値が更新されていることが確認できる。
SELECT * FROM dbo.user_data ORDER BY id ASC

要点まとめ
- バッチファイルとは、Windows環境で実行できるコマンド列を記述したテキストファイルで、バッチファイルを使うと、例えばデータベースに接続して複数のSQL文を実行することができる。




