web-dev-qa-db-ja.com

BULK INSERTでの「列が長すぎる」エラー

CSVファイルからデータを一括挿入する次のコマンドを実行しようとしています-

 BULK INSERT TestDB.dbo.patent
 FROM 'C:\1patents.csv'
 WITH (FIRSTROW = 1,  FIELDTERMINATOR = '^', ROWTERMINATOR='\n');

私が得ているエラーはこれです-

メッセージ4866、レベル16、状態1、行1
一括読み込みに失敗しました。データファイルの行1、列6の列が長すぎます。
フィールドターミネータと行ターミネータが正しく指定されていることを確認します。
メッセージ7399、レベル16、状態1、行1
OLEリンクサーバー "(null)"のDBプロバイダー "BULK"がエラーを報告しました。プロバイダーはエラーに関する情報を提供しませんでした。
メッセージ7330、レベル16、状態2、行1
OLEリンクサーバー "(null)"のDBプロバイダー "BULK"から行をフェッチできません。

これが最初の行のデータです。

 00000001^^18360713^295^4^0

また、表の最後のフィールド(上記のデータの6番目の列= 0に対応)は「int」型です。

ここで何が悪いのですか?上記のエラーが発生するのはなぜですか?

24
Arvind

Oracle/Unixから抽出しました。交換しました\r\n 沿って ROWTERMINATOR = '0x0a'そしてそれは私のために働いた。
どうもありがとう !

52
Fabien Cousin

上記の回答のように、csvファイルをSQL Serverにインポートするのと同じ問題がありました。私はROWTERMINATOR = '\n'を使用しており、'\r\n''\r'も使用しようとしました。それらのどれもうまくいきませんでした。

しかし、ROWTERMINATOR = '0x0a'を使用すると、テーブルは問題なくロードされました。

「なぜ?」はわかりません。この背後で、うまくいけば他の誰かがそれを明らかにすることができます。

18
comendeiro

ファイルソースがUnixでない限り、ファイルの行のターミネータは実際には

\ r\n

16進エディタを使用してファイルのターミネータを検証するか、行のターミネータとして試してください。

4
Eric J.

私は同様の問題に直面し、ファイルがUNIXタイプでない限り\ r\nで問題ないことを知りました。

フォーマットファイル(。fmtまたは.xml)を生成すると、左から3番目の列に注目してください。その呼び出された最小長列。場合によっては、SQLサーバーはデフォルトで2に設定しますが、作成スクリプトでは言及していません。その値をに変更します。 NULLも許可する必要がある場合があるので、これをゼロに変更すると、正常に機能するはずです。

2