バッチファイルでSQLServerのデータをCSV出力する

データベース,バッチファイルSQLServer,バッチ

記事内に広告が含まれています。

バッチファイルでSQLServerのデータをCSV出力する方法をご紹介します。

スポンサーリンク

コーディング例

test.sql

BEGIN
  SET NOCOUNT ON;
  SELECT * FROM TestTable
END

test.bat

@ECHO OFF

REM DB接続情報
SET SERVER_NAME=localhost
SET DB_NAME=TestDB
SET USER_ID=testuser
SET PASSWD=testuser

REM SQLファイルパス
SET SQL_PATH=.\test.sql

REM 出力先パス
SET CSV_PATH=.\test.csv

REM カレントディレクトリの変更
CD %~dp0

REM CSVの出力(tmpファイル)
SQLCMD -S %SERVER_NAME% -d %DB_NAME% -U %USER_ID% -P %PASSWD% -i %SQL_PATH% -b -s, -W -o %OUT_PATH%.tmp

REM tmpファイルからヘッダーとデータの仕切り線を削除
FINDSTR /V "^-" %OUT_PATH%.tmp > %OUT_PATH%

REM tmpファイルを削除
DEL %OUT_PATH%.tmp

実行結果

test.csv

Column1,Column2,Column3
1,A,AA
2,B,BB
3,C,CC

4~7行目ではSQLServerへ接続するための情報を設定しています。
10行目では実行するSQLが記載されたファイルのパスを指定しています。
16行目でカレントディレクトリをtest.batが存在するフォルダに移動していますので、パスの設定はそこからの相対パスで指定しています。
SQLファイルでは「SET NOCOUNT ON;」を指定していますが、これがないとSQLの実行結果に件数が出力されてしまいます。
13行目では出力するCSVのパスを指定しています。10行目と同様で相対パスで指定しています。
19行目でSQLCMDコマンドを使用してSQLファイルの実行結果をCSVとして出力していますが、ここではファイル名の末尾に「.tmp」を付けてテンポラリファイルとして出力しています。
なぜこのようにしているかというと、この出力結果は以下のようになり、ヘッダーとデータの間に仕切り線が出力されてしまいます。

Column1,Column2,Column3
-------,-------,-------
1,A,AA
2,B,BB
3,C,CC

22行目でテンポラリファイルから仕切り線を削除し、指定したCSVへ出力しています。
25行目で不要となったテンポラリファイルを削除しています。

以上、バッチファイルでSQLServerのデータをCSV出力する方法のご紹介でした。

システムトラストでは一緒に働いていただける仲間を募集中です。
記事内に広告が含まれています。
株式会社システムトラスト

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ