miau's blog?

bcp

そんなわけで、bcp でも色々ハマったのでいくつか書いてみます。
(知らない方のために・・・bcp ってのは SQLServer でインポート/エクスポートを行うためのコマンドラインユーティリティです)




■フォーマットファイルの使用

bcp でインポート処理を行いたいわけですが、各列の定義にフォーマットファイルというのを使用しているみたいです。

フォーマット ファイルの使用 - SQL Server の管理

今回インポート先のテーブルが追加されたので、早速フォーマットファイルを作って実行してみました。

bcp db01.user01.TABLE01 in C:\table01.dat /fC:\table01.fmt /SSERVER01 /Uuser01 /pass01

すると、こんなエラーが。


SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]一括コピー ホストのデータファイルが開
けません。


んー・・・?データファイルはちゃんとあるはずだけど?
と疑問に思いつつ、色々調べたんですが、解決せず。

試しに等価な BULK INSERT を実行してみました。
osql を起動して、


BULK INSERT db01.user01.TABLE01 FROM 'C:\table01.dat'
with (formatfile = 'C:\table01.fmt')

こんな感じ。

すると、エラー内容は・・・


メッセージ 4860、レベル 16、状態 1、サーバー SERVER01、行 1
一括挿入できませんでした。ファイル 'C:\table01.fmt' が存在しません。

あー。存在してないのってフォーマットファイルの方だったのね。


■bcp と BULK INSERT

どうも BULK INSERT のほうがエラーメッセージが親切みたいです。全体的に。
例えば、フォーマットファイルの記述が変だった場合、bcp では


SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC SQL Server Driver]BCP データファイル中で予期しない EOF
が検出されました。

しか出ないところが、BULK INSERT だと


メッセージ 4827、レベル 16、状態 1、サーバー SERVER01、行 1
一括挿入できませんでした。フォーマット ファイル 'C:\table01.fmt' 内の列番号 1
の列終了記号が無効です。

まで表示してくれるわけで。

BULK INSERT って DB サーバ上でしか使えないかもしれないけど、使えるときはこっち使ったほうがいいかも。


■BULK INSERT エラーメッセージの英語表示

SET LANGUAGE English としておくと、エラーメッセージが英語で表示されます。
これで何が助かるかっていうと・・・例えば「bcp のフォーマットファイル中に正しくないホスト行番号が見つかりました。」というエラーが出た場合。
このメッセージでググってもあまり有用な情報は得られませんでした。
でも英語でのエラーメッセージ「Invalid column number in format file」のほうでググると、有用な情報が得られたり。


■フォーマットファイルのバージョン

で、有用な情報っていうのは、これ。

Bulk insert Format File


After all, the statement for sql 7 and 2000 should have some difference.


とのことで、最初のリンクに書いてある説明

注 フィールドがデータ ファイルに存在しない場合には、
0 のプレフィックス長、0 の長さ、0 のサーバー列の順序、
および終端文字なしを指定することによって、
テーブル列のインポートをスキップできます。

の部分は、SQLServer 2000(Version 8.x)に対してだけ有効らしい。
ので、フォーマットファイルの先頭行を「7.0」から「8.0」にして事なきを得ました。


■その他

ここまで書いておいてなんだけど、今回の処理は DTS のほうが楽に作れたんじゃないかって気がする。
元々 SQLServer 7.0(?)か何かを使ってたせいかもしれないけど・・・DTS の存在知らなかった、とかいうオチじゃなければいいな・・・。

あともうひとつどうでもいい部分で引っかかってたんですが、これはさらに別項で。


(2007-04-11 追記)

バージョンの問題って書いたけど、結局のところフォーマットファイルのバージョンが 7.0 から 8.0 に変わると、照合順序の列を増やさないといけないらしい。
7.0 と書いておきながら照合順序の列が含まれていたのが問題だったということで。
posted at 19:28:29 on 2005-08-21 by miau - Category: Work No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。