2007.03.07

Unicodeファイルの Bulk Insert / bcp

Unicodeのファイルを Bulk Insert や bcp で読む必要がある場合、
テーブルとファイルの形がそのままであれば
フィールド区切りがカンマだろうがタブだろうが直接指定で問題なく取り込める。

BULK INSERT work FROM 'c:\unicode.dat' WITH ( DATAFILETYPE='widechar', FIELDTERMINATOR=',' )
BULK INSERT work FROM 'c:\unicode.dat' WITH ( DATAFILETYPE='widechar', FIELDTERMINATOR='\t' )

bcp db..work in c:\unicode.dat -w -t"," -T
bcp db..work in c:\unicode.dat -w -t"\t" -T


しかし、テーブルに Identityの行番号をふったり、チェックエラーコードの項目を持ったりして
形が変ってしまうと、フォーマットファイルなるものを作らなくてはいけなくなる。

これが Unicode相手の場合はクセモノ。
たとえば、以下のような記述が必要なのです。(Little Endianの場合)
非常にわかりづらいす。

9.0
3
1 SQLNCHAR 0 256 ",\0" 1 Field1 Japanese_CI_AS
2 SQLNCHAR 0 256 ",\0" 2 Field2 Japanese_CI_AS
3 SQLNCHAR 0 256 "\r\0\n\0" 3 Field3 Japanese_CI_AS
9.0
3
1 SQLNCHAR 0 256 "\t\0" 1 Field1 Japanese_CI_AS
2 SQLNCHAR 0 256 "\t\0" 2 Field2 Japanese_CI_AS
3 SQLNCHAR 0 256 "\r\0\n\0" 3 Field3 Japanese_CI_AS
  (このファイル自体は ShiftJISで作成する)


実行自体はいつものとおり。

BULK INSERT work FROM 'c:\unicode.dat' WITH ( FORMATFILE='c:\unicodeimp.fmt' )

bcp db..work in c:\unicode.dat -fc:\unicodeimp.fmt -T


また、テーブルの char/varcharフィールドに入った時点?で、見慣れた ShiftJISなんかに変っている。
(化けていない)


なお、『Unicodeのファイル』は、ファイルの先頭2バイトに FFFE 等の“BOM”が付いたものと
付いていないレアなファイルが存在しうるが、
bcp や Bulk Insert はどちらも気にせず思うとおりの処理をしてくれるみたいです。

---投稿者一言コメント----------

Unicodeファイルを ShiftJISに即席変換するというのも時には有効かも。
たとえば コマンドプロンプトで以下のように
 type unicode.dat > shiftjis.dat

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
ichikawa