#この記事を書いたわけ#
職場でsqlcmdを実行するWindowsバッチを書く必要が出てきたので、予習のために自分でバッチを書いてみました。
設定ファイルの書き方とか数値をリダイレクトするときの注意とかsqlcmdを実行したときのエラー判定とか
実際に書いてみると詰まるところがあったので、備忘録として残しておきます。
#使い方#
①下記のディレクトリ構成の通りにファイルを配置します。
②settei.batの設定値 sqlcmd接続情報を記載します。
③select文をsample.sqlに記載します。
④sample.batをダブルクリックします。
■設定方法
settei.batの設定値を変更することで発行するSQL等を変更できます。
■ディレクトリ構成
Qiitaにはzipをあげられないので、少し手間がかかりますが以下の構成となるようにファイルを配置します。
WindowsBat
│ sample.bat :このbatファイルをダブルクリックでSQLSERVERに接続します。
│
├─output
│ res.txt :sqlcmdの実行結果値が出力されます。batが実行されれば、作成されます。
│ test.log :batの実行結果が追記されます。batが実行されれば、作成されます。
│
├─settei
│ settei.bat :sample.batを制御する設定ファイルです。
│
└─sql
sample.sql :sample.batのsqlcmdを経由して発行されるSQLです。
#ファイル
@echo off
rem sqlcmdを実行し、正常終了、異常終了で処理を分岐させるプログラム
rem カレントディレクトリ配下のsetteiディレクトリの設定batを呼び出す
call ./settei/settei.bat
echo プログラムを実行します。
echo 止めたい場合はコマンドプロンプトを閉じてください。
rem 一時停止
pause
rem 画面メッセージのクリア
cls
rem -------処理記載ここから------
rem SQLSERVERにsqlcmdで接続を行う
%sqlcmd% ./sql/%sqlFile% -v param=%sqlParam% -b -s, >> ./output/%fileNameLog% 2>&1
rem sqlcmd実行結果で処理を分岐
rem 0:正常終了 それ以外:異常終了
if %errorlevel% equ 0 (
echo 正常終了しました。>> ./output/%fileNameLog%
rem リダイレクトの直前の数値はコマンドに影響を与えるため、
rem echo %resNormal%> ./output/%fileNameTxt%
rem とはせず、以下とする。
> ./output/%fileNameTxt% echo %resNormal%
) else (
echo 異常終了しました。>> ./output/%fileNameLog%
rem logを標準出力に表示する
type %~dp0\output\%fileNameLog%
> ./output/%fileNameTxt% echo %resError%
)
rem -------処理記載ここまで------
echo プログラムが終了しました。
pause
exit
rem 設定ファイル。他ファイルから呼び出される
rem ■参考
rem sqlcmd パラメータ詳細
rem http://msdn.microsoft.com/ja-jp/library/ms162773.aspx
rem 正常結果値
set resNormal=0
rem 異常結果値
set resError=99
rem 出力するファイル名称_log
set fileNameLog=test.log
rem 出力するファイル名称_一時ファイル
set fileNameTxt=res.txt
rem sqlcmd接続情報
set sqlcmd=sqlcmd -S サーバー名 -d DB名 -U ユーザー名 -P パスワード -i
rem sqlファイル
set sqlFile=sample.sql
rem sqlパラメータ
set sqlParam='abc101'
--1 行処理されました と処理文の出力をさせない--
set nocount on;
SELECT
colCA
FROM
Table_1
WHERE
colCA = $(param)
;
#参考にしたところ#
以下のサイトを参考にして作りました。
ここで書いとかないとまた詰まりそうなので、記載してきます。