ってコトで、調べつつ組んでみた。
結論から言うと、「xp_cmdshell」は権限がなくて使えなかった。
(ローカルの SQL Server ではなくて、共有のテストサーバーを利用しているので、権限変更できない)
でも、折角なのでメモ。
--*--* bcpユーティリティ
「bcpユーティリティは、一度に1つのテーブルを処理するコマンドラインユーティリティです。」
と説明されています。
SQL Server 2005 ストアドプロシージャプログラミングに書いてある。
この「bcp」を使うと、DBのテーブルからデータをテキストファイルにエクスポート(出力)することが可能。
また、ファイルからDBにインポートすることも可能らしい。(試していない)
bcpユーティリティ詳細(MSDN)
1. 先ず、基本的な形のコマンドを流す。
--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
-- 特定テーブルを一括出力
bcp database名.schema名.table名 out "ファイル出力先パス(ファイル名)" -U username -P password
↓
bcp dbHoge.dbo.tbHuge out "C:\ListBackUp.csv" -U sa -P hogehoge
--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
上記は、
dbHogeというデータベースのdbo(デフォルトのスキーマ名)というスキーマにある、
tbHuge というテーブルのデータを、SQL ServerのあるPC(ローカル)の
【C:\】ドライブ直下に『ListBackUp.csv』というファイル名の CSVファイルに出力する。
ちなみに、指定したファイル名のファイルが既に存在すれば、内容を上書き(元の内容は削除)
して、存在しなければ新規に作成して書き込んでくれる。
ローカルではなく、ネットワーク上の SQL Server とデータをやりとりするには、
「-S」オプションをつけてサーバを指定する必要がある。
この場合のファイル名は、コマンド発行したPC(自分のPC)のパスを指す。
--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
bcp dbHoge.dbo.tbHuge out "C:\ListBackUp.csv" -S 192.168.xx.xx -U sa -P hogehoge
--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
オプションは他にも色々ある。必要に応じて追記したらいいと思う。
詳細はMSDNで。
2.上記のコマンドを実行すると、出力形式について対話形式で確認が行われる。
指定したテーブルのフィールド数分。
確認される質問は以下な感じ。アタクシがやってみた例。
--------------------------------------------------------------------------------
"フィールド cColA [nchar] のファイルストレージ型を入力してください"
⇒「nchar」と入力してEnter押下
"フィールド cColA [1] のプレフィックス長を入力してください"
⇒「1」と入力してEnter
"フィールド ターミネータ [none] を入力してください"
⇒何も入力しないでEnter
--------------------------------------------------------------------------------
↑は、フィールド一つ分の確認。これが1セット。
指定したテーブルのフィールドが10個あれば、これが10回繰り返される。
「ファイルストレージ型」と「プレフィックス長」については、フィールドのデータ型
などで変わるので、全て同じではない。
3.この確認が終わると、最後の質問がある。
--------------------------------------------------------------------------------
"このフォーマット情報をファイルに保存しますか? [y/n]"
⇒「y」と入力してEnter、もっかいEnter
--------------------------------------------------------------------------------
すると、ファイル出力先に指定したパスに、「ListBackUp.csv」と「bcp.fmt」という
ファイルが作成される。
「ListBackUp.csv」を開いてみると、思ったようにきれいにはデータはできていない。
4.これを整形するために、「bcp.fmt」を編集する。
「bcp.fmt」をメモ帳(NotePad)で開く。
============================================================
9.0
5
1 SQLNUMERIC 1 19 "" 1 cColA Japanese_CI_AS
2 SQLNUMERIC 1 19 "" 2 vcColB Japanese_CI_AS
3 SQLTINYINT 0 1 "" 3 tiColC ""
4 SQLDATETIME 0 8 "" 4 dtColD ""
5 SQLNUMERIC 1 19 "" 5 cColE Japanese_CI_AS
============================================================
↑さっき、上記の対話確認の結果作成された内容(らしい)。
1行目 :「9.0」 ⇒ バージョン
2行目 :「5」フィールド数
3行目~:フィールドの出力形式
3行目以降に各々色づけしたのは以下の説明のため。
●1 ファイルでの、フィールド番号
●2 フィールドの データ型
●3 フィールドの プレフィックス長
●4 フィールドの データサイズ
●5 フィールドの 終端文字
●6 DBテーブル内での、フィールド番号
●7 DBテーブル内での、フィールド名
●8 フィールドの 照合順序
正直、「nchar」と入力した項目(1, 2, 5) が『SQLNUMERIC』となっているのは
よくわからん。なぜにニューメリック。
とにもかくにも、コレを以下のように編集と思うように出力される(た)。
太文字。
============================================================
9.0
5
1 SYBCHAR 0 19 "," 1 cColA ""
2 SYBCHAR 0 19 "," 2 vcColB ""
3 SYBCHAR 0 1 "," 3 tiColC ""
4 SYBCHAR 0 8 "," 4 dtColD ""
5 SYBCHAR 0 19 "\r\n" 5 cColE ""
============================================================
フィールド番号1~4 の終端文字を「,」にしたのは、 CSVファイルにしたかったから。
好きなものにしたらいい。
フィールド番号5 は、改行コード。データ1行毎に改行したいので。
6.編集したファイルを名前を付けて保存する。
名称は仮に『OutputList.fmt』にする。保存先はCドライブ直下。
7.編集した『OutputList.fmt』をフォーマットオプションで指定して、データ出力してみる。
--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
bcp dbHoge.dbo.tbHuge out "C:\ListBackUp.csv" -f
C:\OutputList.fmt -U sa -P hogehoge--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--
ちょっと中断。編集中。
テーブルの一括出力だけでなく、オプションでクエリを利用することも可能。
ほしいデータだけを出力できる。
ワタクシが使ってみたのは以下な感じ。