![](https://loosecarrot.com/wp-content/uploads/2020/02/7e07b1d28193de5d08fd8647004f1bd2-1-1.png)
SQLでインターフェースファイルを作るときに、ファイルを出力する必要があります。
Transact-SQLを組んでもいいのですが、結構面倒です。
SQLをバッチコマンドで実行する方法を備忘録として残しておきます。
ヘッダと明細の列数が異なるデータを抽出する記事を書いた時にも思っていました。
![](https://loosecarrot.com/wp-content/uploads/2020/02/9f23b6b28c9028d7cfc1c3a659c41143-320x180.jpg)
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]です。
実行した結果はこんな感じです。
![](https://loosecarrot.com/wp-content/uploads/2020/02/cebdd49ec954db83a8dac01bd4bf310f.jpg)
![](https://loosecarrot.com/wp-content/uploads/2020/02/cebdd49ec954db83a8dac01bd4bf310f.jpg)
(補足)ストアドの中身
dbo.GET_BUYING_HEAD_DETAILは以下のようなデータをSELECTするストアドです。
![](https://loosecarrot.com/wp-content/uploads/2020/02/9f23b6b28c9028d7cfc1c3a659c41143-320x180.jpg)
![](https://loosecarrot.com/wp-content/uploads/2020/02/9f23b6b28c9028d7cfc1c3a659c41143-320x180.jpg)
![](https://loosecarrot.com/wp-content/uploads/2020/02/9f23b6b28c9028d7cfc1c3a659c41143-320x180.jpg)
SQL ヘッダー行と明細(データ)行で項目数が異なるデータを抽出する
IFファイルを作るときに、ヘッダー行、明細行、明細行...、ヘッダー行、明細行、明細行...のような作りのことがあります。
...
![](https://loosecarrot.com/wp-content/uploads/2020/02/75b54500f71fb8c6cc053750031c3549.jpg)
![](https://loosecarrot.com/wp-content/uploads/2020/02/75b54500f71fb8c6cc053750031c3549.jpg)
SQLとバッチの応用
少し応用編です。
インターフェースファイルとして使うには以下がまだ問題です。
・コマンドを毎回打って実行しかできない。
・明細行に不要なタブや区切り文字がある
ということで、定期実行でも使える処理バッチにしてみました。
ファイル名は出力した日時にするようにしています。
こちらからダウンロード可能です。
実行結果
以下のように不要なタブ(区切り文字)も削除することができました。
![](https://loosecarrot.com/wp-content/uploads/2020/02/42692d24c4a27f61dc819d3caeb9fee4.jpg)
![](https://loosecarrot.com/wp-content/uploads/2020/02/42692d24c4a27f61dc819d3caeb9fee4.jpg)
ファイル名も出力した日時で出ています。
実行するタイミングはタスクスケジューラで定時実行にすればOKです。
![](https://loosecarrot.com/wp-content/uploads/2020/02/41f70ebeb7f55f893e9bd304158cde00.jpg)
![](https://loosecarrot.com/wp-content/uploads/2020/02/41f70ebeb7f55f893e9bd304158cde00.jpg)