はじめに
さて、前回の記事でSELECT結果をCSV出力することが可能になりました。
しかし、SQLCMDコマンドでエラーが起きたらどうしましょう?
そのバッチファイルの処理を1回だけ実行するだけなら、CSVファイルにエラー内容が出力されます。
しかし、タイムスケジューラーで何度も実行するとしたら?
CSVファイルがどんどん上書きされてしまうから
いつどんなエラーが起きてるかわからなくなってしまいますよね。
(ここではCSVファイルのファイル名に日時を出力していくつもファイルを作ることをしないことにします。)
そこで、前回の記事で作成したバッチファイルに追記して、
SQLCMDコマンドの実行結果をログファイルに出力してみましょう。
どうやってSQLCMDコマンドのエラーを検知するの?
%ERRORLEVEL%
を使います。
前回の記事で作成したバッチファイルに以下を追記しましょう。
set d=%date%
set t=%time: =0%
sqlcmd -S svname1 -d dbname1 -U user1 -P test1 -i test.sql -v param='9999' -b -s, -W -o test.csv
if %errorlevel% equ 0 (
echo %d% %t% test.sql It ended normally. >> log.txt
) else (
echo %d% %t% test.sql It ended abnormally. >> log.txt
)
追記したtest.batをダブルクリックして実行してみましょう。
test.batと同じディレクトリに、test.csvとlog.txtが生成されたはずです。
test.csvにはSELECT結果、log.txtには実行結果が出力されています。
解説
set d=%date% ...日付をyyyy/mm/dd形式で取得する
set t=%time: =0% ...時間をhh:mn:ss形式で取得する。
timeコマンドのみだと、hh:mn:ss形式で取得できない。
ログファイルに出力するための現在日時を取得します。
sqlcmd -S svname1 -d dbname1 -U user1 -P test1 -i test.sql -v param='9999' -b -s, -W -o test.csv
前回の記事参照。
if %errorlevel% equ 0 (
echo %d% %t% test.sql It ended normally. >> log.txt
) else (
echo %d% %t% test.sql It ended abnormally. >> log.txt
)
%ERRORLEVEL%
が0の時は正常終了なので、「yyyy/mm/dd hh:mn:ss
(現在日時) test.sql It ended normally.」とlog.txtに出力し、そうでない場合は異常終了なので、「yyyy/mm/dd hh:mn:ss
(現在日時) test.sql It ended abnormally.」と出力します。
そのうち調べたいこと
%ERRORLEVEL%
の値によって、どういうエラーを表すかとかそういうことがわかると便利そうですよね。知りたい。
参考
バッチファイルで現在時刻をyyyy/mm/dd hh: mm:ss形式で取得するための備忘録
sqlcmdを実行するWindowsバッチ