LoginSignup
16
20

More than 5 years have passed since last update.

sqlcmdを実行するWindowsバッチ

Last updated at Posted at 2017-01-03

この記事を書いたわけ

職場で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です。

ファイル

sample.bat
@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
settei.bat
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'

sample.sql
--1 行処理されました と処理文の出力をさせない--
set nocount on;

SELECT
colCA
FROM
Table_1
WHERE
colCA = $(param)
;

参考にしたところ

以下のサイトを参考にして作りました。
ここで書いとかないとまた詰まりそうなので、記載してきます。

batファイルでSQLServerのSelect結果をCSV形式で出力する。

echoの出力の最後のスペースを除去したい

sqlcmd ユーティリティ

BATファイルで環境変数を設定ファイルから読み込む方法

バッチファイルのあるディレクトリ

.bat(バッチファイル)のifコマンド解説。

標準エラー出力をファイルへ出力

開発に役立つ,BATファイルの書き方・パターン集

16
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
20