SQLでインターフェースファイルを作るときに、ファイルを出力する必要があります。
Transact-SQLを組んでもいいのですが、結構面倒です。
SQLをバッチコマンドで実行する方法を備忘録として残しておきます。
ヘッダと明細の列数が異なるデータを抽出する記事を書いた時にも思っていました。
SQL ヘッダー行と明細(データ)行で項目数が異なるデータを抽出する
IFファイルを作るときに、ヘッダー行、明細行、明細行...、ヘッダー行、明細行、明細行...のような作りのことがあります。
...
デモンストレーションで動かした動画を載せておきます。
SQLserverからファイル出力する書き方
書き方はこんな感じです。
SQLServer認証の場合
bcp “SQL文 or ストアド名” queryout “出力パス” -c -t 区切り文字 -S サーバ名 or IP -U sa -P パスワード
Windows認証の場合
bcp “SQL文 or ストアド名” queryout “出力パス” -c -t 区切り文字 -S サーバ名 or IP –T
BCPで出力してみる
実行結果
以下のコマンドをコマンドプロンプトから実行しました。
1 |
bcp "BuyingReport.dbo.GET_BUYING_HEAD_DETAIL" queryout "C:\Csv\GET_BUYING_HEAD_DETAIL.tsv" -c -t \t -S サーバ名 –T |
サーバ名は自分のSQLSERVER名を入れて下さい
区切り文字は[tab]です。
実行した結果はこんな感じです。
(補足)ストアドの中身
dbo.GET_BUYING_HEAD_DETAILは以下のようなデータをSELECTするストアドです。
SQL ヘッダー行と明細(データ)行で項目数が異なるデータを抽出する
IFファイルを作るときに、ヘッダー行、明細行、明細行...、ヘッダー行、明細行、明細行...のような作りのことがあります。
...
SQLとバッチの応用
少し応用編です。
インターフェースファイルとして使うには以下がまだ問題です。
・コマンドを毎回打って実行しかできない。
・明細行に不要なタブや区切り文字がある
ということで、定期実行でも使える処理バッチにしてみました。
ファイル名は出力した日時にするようにしています。
こちらからダウンロード可能です。
実行結果
以下のように不要なタブ(区切り文字)も削除することができました。
ファイル名も出力した日時で出ています。
実行するタイミングはタスクスケジューラで定時実行にすればOKです。