SQLServerでselectの結果をCSVで出力する方法。
SQLServer で select の結果を CSV で出力する方法。
management studio を使って CSV を出力する方法もありますが、定期的に CSV で出力したいときや、何回も出力したいとき、バッチで実行できれば早く正確に実行できるようになります。
SELECT の結果を CSV 出力するコマンドサンプル
バッチファイルに sqlcmd コマンドを実行するコードを書いて、そのコマンドに SELECT 文を書いた SQL ファイルを指定するイメージです。
sqlcmd -S [サーバ名] -d [DB名] -U [ユーザ名] -P [パスワード] -i [SQLファイル名] -v [パラメータ] -b -s [区切り文字] -W -o [出力ファイル名]
実際にパラメータを指定した例
sqlcmd -S svname1 -d dbname1 -U user1 -P test1 -i test.sql -v param=‘11111111’ -b -s, -W -o test.csv
パラメータ
簡単にパラメータの意味を記載しておきます。
-S:接続先のSQLServerインスタンスを指定する。
-d:データベース名を指定する。
-U:データベースのユーザを指定する。
-P:-Uで指定したユーザのパスワードを指定する。
-i:実行するSQLファイルを指定する。
-v:変数を指定する。
-b:エラーが発生したときに、sqlcmd を終了し、DOS ERRORLEVEL 値を返すようにする。
-s:区切り文字を指定する。アンパサンド (&)、セミコロン (;) など、特別な意味を持つ文字を使用する場合は、ダブルクォーテーション (") で囲む。
例:
sqlcmd -S svname1 -d dbname1 -U user1 -P test1 -i test.sql -v param='11111111' -b -s ";" -W -o test.csv
-W:後続の空白を削除する。
-o:出力するファイルを指定する。
SQL ファイルの中身
ファイル名は適当に、test.sql とつけていますがこれは何でも OK です。
select
*
from
testtable
where
id = $(param)
ただ、このままだと、出力したファイルの中に、「n 件処理されました。」も出力されてしまうので、これを出さないように「set nocount on」を書いておきます。
set nocount on
select
*
from
testtable
where
id = $(param)
set nocount off
これで、SELECT の結果データだけが出力されるようになります。
さらに、項目を引用符で囲みたいときは下記のようにしておきます。
select
'"' + col1 + '"'
from
testtable
testtable の co1 を全件出力する例になります。
select
'"' + col1 + '"'
from
testtable
where
id = $(param)
何かパラメータを指定して、条件が一致するデータだけを出力する場合は、「$(param)」を使って、外からパラメータを渡すこともできます。
この例では 1 項目ずつダブルクォーテーションで挟んでいますが、SQL スクリプトをうまく書けば、ループで処理できると思います。
参照サイト
詳しいオプションについては、下記を参照。