バッチファイル

バッチファイルでSELECT文の実行結果をファイルに出力してみた

バッチファイルとは、Windows環境で実行できるコマンド列を記述したテキストファイルで、バッチファイルを使うと、データベースに接続してSQL文を実行するだけでなく、そのSQL文の実行結果をファイルに出力することもできる。

今回は、バッチファイルからSQL Serverに接続し、SELECT文を実行した結果をファイルに出力してみたので、そのサンプルプログラムを共有する。

前提条件

下記記事の実装が完了していること。

バッチファイルからSQL Serverに接続してみたバッチファイルとは、Windows環境で実行できるコマンド列を記述したテキストファイルで、バッチファイルを使うと、例えばデータベースに接...

サンプルプログラムの作成

サンプルプログラムの構成は、以下の通り。
サンプルプログラムの構成

setting.iniの内容は以下の通りで、前提条件のプログラムと同じ内容で、データベースの接続先などを定義している。

;共通設定ファイル

;DBサーバー名
serverName=localhost
;ユーザー名
userName=USER01
;パスワード
userPass=USER01
;DB名
dbName=master
;スキーマ名
schemaName=dbo
;様々な文字を含むパラメータ
param=!"#$%&'()=-~^|\`@{[;]}+<>*/:_?\

output_maxid_minid.batの内容は以下の通りで、変数execSqlに定義した2つのSQLを実行し、結果をoutput.log(変数outputFileで定義)に出力している。

@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



削除または保存していないWordドキュメントの復元方法【4DDiG Windowsデータ復元】ワード(Word)データ等のファイルを誤って削除してしまった場合は、通常はデータの復元ができませんが、4DDiGというソフトウェアを利用...

サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1) バッチファイルを実行前のデータは、以下の通り。

SELECT * FROM dbo.user_data ORDER BY id ASC
サンプルプログラムの実行結果_1

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

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

4) バッチ実行後にバッチファイルが存在するディレクトリ(C:\tmp)を確認すると、以下のように、output.log(変数outputFileで定義)が出力されていることが確認できる。
サンプルプログラムの実行結果_4

5) output.log(変数outputFileで定義)の中身は以下の通りで、コンソール上と同じ内容が出力されていることが確認できる。
サンプルプログラムの実行結果_5

6) user_dataテーブルの内容を、以下のように変更する。

SELECT * FROM dbo.user_data ORDER BY id ASC
サンプルプログラムの実行結果_6

7) バッチファイル(output_maxid_minid.bat)を再度実行する。実行すると、コマンドプロンプトには以下の値が表示される。
サンプルプログラムの実行結果_7

8) output.log(変数outputFileで定義)の中身は以下の通りで、コンソール上と同じ内容が追加で出力されていることが確認できる。
サンプルプログラムの実行結果_8

要点まとめ

  • バッチファイルとは、Windows環境で実行できるコマンド列を記述したテキストファイルで、バッチファイルを使うと、データベースに接続してSQL文を実行するだけでなく、そのSQL文の実行結果をファイルに出力することもできる。
  • バッチファイル内で、関数(特定の処理を1つにまとめたもの)を呼び出すこともできる。