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