SQLServerでselectの結果をCSVで出力する方法。

2017.11.26

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 スクリプトをうまく書けば、ループで処理できると思います。

参照サイト

詳しいオプションについては、下記を参照。

http://msdn.microsoft.com/ja-jp/library/ms162773.aspx