バッチファイルでSQLServerのデータをCSV出力する
バッチファイルで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出力する方法のご紹介でした。