くんすとの備忘録

IT系技術メモ

移転しました。

15秒後に自動的にリダイレクトします。

【BAT】コマンドプロンプトからSQLを発行する

BATファイルでSQL(SELECTだけ)を発行します。
コマンドプロンプトで作業中にマスタの中身を覗きたい時とか、バッチ処理でテーブルの内容をCSVに落としたいときとかにべんり。

[SELECT.bat]

@if (1==1) /*
@echo off
setlocal
if "%~1"=="" goto :USAGE
if "%~1"=="/?" goto :USAGE

rem ********************************************************************************
:MAIN
if "%SELECT-ODBC%"=="" (
	echo 環境変数「SELECT-ODBC」が設定されていません
	set ERRORLEVEL=9
	goto :eof
)

set SQL=%~n0 %*
CScript //nologo //E:JScript "%~f0" "%SELECT-ODBC%" "%SELECT-UID%" "%SELECT-PWD%" "%SQL%"
goto :eof

rem ********************************************************************************
:USAGE
echo USAGE:%~n0
echo   ODBCで接続しているDBに対し、SELECT文を発行します。
echo.
echo   接続先のデータベースやユーザIDは、環境変数で指定します。
echo.
echo   [環境変数]
echo     このコマンドの実行には、下記の環境変数の設定が必須です。
echo.
echo     SELECT-ODBC
echo        このコマンドで使用するODBCデータソース名
echo     SELECT-UID
echo        このコマンドで使用するODBC接続のUID
echo     SELECT-PWD
echo        このコマンドで使用するODBC接続のパスワード
echo.
goto :eof

rem ********************************************************************************
rem */
@end
Args = WScript.Arguments;

var aOdbc = Args(0);
var aUid = Args(1);
var aPwd = Args(2);
var aSql = Args(3);

var connectionString = "dsn=" + aOdbc;
if (aUid != "")
	connectionString += ";uid=" + aUid;
if (aPwd != "")
	connectionString += ";pwd=" + aPwd;
var conn = new ActiveXObject("ADODB.Connection");
conn.Open(connectionString);

var rs = conn.Execute(aSql);
var line = ""
// ヘッダ
for (var i=0; i<rs.Fields.Count; i++){
	line += "\"" + rs.Fields(i).Name + "\",";
}
WScript.Echo(line.substring(0,line.length - 1));
//データ
while(!rs.EOF){
	var line = ""
	for (var i=0; i<rs.Fields.Count; i++){
		line += "\"" + rs.Fields(i).Value + "\",";
	}
	WScript.Echo(line.substring(0,line.length - 1));
	rs.MoveNext();
}
conn.Close();

使用例

$ SELECT * FROM MAST01 WHERE ITEM-CD = 01

<< 標準出力 >>
"ITEM-CODE","ITEM-NAME"
"01", "HOGE"

こんな感じで、全部ダブルクォート区切りのCSVで出力されます。
ファイルにリダイレクトしたらCSVファイルになるよ。

解説

  • BATファイルにJScriptを埋め込んで、そこでADO使ってODBC接続してます。
  • コマンド名を「SELECT」にしているので、SQL文をそのまま書いているような錯覚に陥ることができます。

こんな感じで。