SQLServerでSELECT結果をCSVで出力する

SQL
スポンサーリンク

SQLServerでSQLを実行したいときは、ManagementStudioで実行すればその場で結果を確認することができますが、毎日同じ時間などに自動でSELECTした結果を実行したい要望がありました。この対応に時間をかけるほどでもなかったので今回はsqlcmdでSELECT結果をcsv形式(カンマ区切り)で出力するバッチを作成して、Windowsのタスクスケジューラーに登録して実行することにしました。

ヘッダー出力有り無しなのでいろいろな実現方法があると思います。

今回はその時の対応について書こうと思います。

sqlcmdでSELECT結果をcsv出力

SQLServerでSELECT結果をCSV出力する方法 サンプルデータ

SQL

ヘッダありの場合

ヘッダが必要な場合は、以下のコマンドで取得できます。

[test.bat] 
sqlcmd -S インスタンス名 -E -d TEST -i test.sql , -b -s, -W -o test.csv

sqlcmdのオプション

-Sサーバー名
-EWindows認証
-i入力ファイル(出力したいSQLを記載)
-bエラーが発生した場合は、バッチを中止
-s列の区切り文字csvの場合は,(カンマ)を指定する。
-W余分なスペースを削除
-o出力ファイル
-dデータベース名
[test.sql] 
set nocount on 
SELECT * FROM table1

set no count onを付与している理由は、最終行に(x行処理されました。)と表示されてしまい邪魔なので記述しています。

test.csvの出力結果

csv

ヘッダなしの場合

ヘッダなしの場合はsqlcmdのオプションで-h -1にすれば、ヘッダが消えます。

[test.bat] 
sqlcmd -S インスタンス名 -E -d TEST -i test.sql , -b -s, -W -h -1 -o test.csv
オプション説明
-h-1にするとヘッダーを出力しない
headerなし
headerなしで出力した場合

ヘッダは必要だが2行目の——を消したい

ヘッダありの場合は、オプション:-hを付与せずに実行すればOKですが、一つ問題があります。

それは2行目に——が出力されてしまう。。。。

csv

これは、いろいろやり方がありますが、今回はヘッダー用とデータ用に分割して実行し、最後にtypeコマンドで結合することにしました。

ヘッダ作成用SQL

 --ヘッダー用SQL 
set nocount on SELECT 'col1','col2','col3','col4',''col5

データ作成用SQL

set nocount on SELECT * FROM table1

ヘッダ作成用SQLとデータ作成用SQLを実行して結合するバッチ

rem ヘッダ用
 sqlcmd -S インスタンス名 -E -d TEST -i heder.sql , -b -s, -W -h -1 -o header.csv 
rem データ用 
sqlcmd -S インスタンス名 -E -d TEST -i test.sql , -b -s, -W -h -1 -o test.csv
rem ヘッダーとデータを連結してKEKKA.csvに出力
 type header.csv test.csv >KEKKA.csv

type header.csv test.csv >KEKKA.csv

type ファイル1 ファイル2でファイルが結合されてその結果をリダイレクトで出力しています。
typeコマンドは簡単にファイルの結合ができるので便利です。

KEKKA.csvの出力結果

結果

2行目の—-が削除されてヘッダも存在する。

まとめ

  • set no count onで不要な行メッセージを出力しないようにできる。
  • ヘッダなしの場合は、sqlcmdのオプションで -h -1にする。

※この方法はバッチしばりの方法でPowershellなどでやるともっと簡単にファイル作成ができます。
 私の環境ではPowershellを動かすことが環境だったのでバッチで実行しています。

powershellでやりたい場合は以下を参考にしてみてください。

コメント

タイトルとURLをコピーしました