32

私は一括挿入を行っています:

DECLARE @row_terminator CHAR;
SET @row_terminator = CHAR(10); -- or char(10)

DECLARE @stmt NVARCHAR(2000);
SET @stmt = '
  BULK INSERT accn_errors
   FROM ''F:\FullUnzipped\accn_errors_201205080105.txt''
   WITH 
      (
        firstrow=2,
FIELDTERMINATOR = ''|''  ,
ROWS_PER_BATCH=10000
   ,ROWTERMINATOR='''+@row_terminator+'''
   )'
exec sp_executesql @stmt;

次のエラーが表示されます。

Msg 4832, Level 16, State 1, Line 2
Bulk load: An unexpected end of file was encountered in the data file.
Msg 7399, Level 16, State 1, Line 2
The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error.
Msg 7330, Level 16, State 2, Line 2
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".

このエラーが発生した行を知る方法はありますか?

問題なく10,000,000行をインポートでき、その後エラーが発生します

4

11 に答える 11

55

問題のある行を見つけるには、エラーファイル指定子を使用します。

BULK INSERT myData
FROM 'C:\...\...\myData.csv'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
ERRORFILE = 'C:\...\...\myRubbishData.log' 
);

myRubbishData.logには問題のある行があり、コンパニオンファイルmyRubbishData.log.txtは、ファイルへの行番号とオフセットを提供します。

コンパニオンファイルの例:

Row 3 File Offset 152 ErrorFile Offset 0 - HRESULT 0x80004005
Row 5 File Offset 268 ErrorFile Offset 60 - HRESULT 0x80004005
Row 7 File Offset 384 ErrorFile Offset 120 - HRESULT 0x80004005
Row 10 File Offset 600 ErrorFile Offset 180 - HRESULT 0x80004005
Row 12 File Offset 827 ErrorFile Offset 301 - HRESULT 0x80004005
Row 13 File Offset 942 ErrorFile Offset 416 - HRESULT 0x80004005
于 2012-10-29T20:29:16.807 に答える
6

楽しい楽しい楽しい。これらの問題をデバッグするための良い方法が見つからなかったので、ブルートフォースを使用します。つまり、FirstRowオプションとLastRowオプションは非常に便利です。

LastRow = 2から始めて、試してみてください。結果を使い捨てのテーブルにロードします。これにより、簡単に切り捨てることができます。

また、最初の行が問題を引き起こしている可能性があることにも注意する必要があります。

于 2012-05-08T22:19:11.557 に答える
3

ええ - BULK INSERT は、エラー メッセージにもう少し詳細が表示されます。これを回避する唯一の方法は、Gordon が正しく指摘したように、ブルート フォース アプローチを使用することです。ただし、最初に、取得しているエラーに基づいて、行ターミネーターを理解していないか、ファイルの最後に行ターミネーターがありません。FIRSTROW と LASTROW を使用すると、それを判断するのに役立ちます。

したがって、次のことを行う必要があります。

  1. ファイルの最後に行ターミネータがあることを確認してください。そうでない場合は、1 つ入れて再試行してください。また、最後の行に必要なフィールドがすべて含まれていることを確認してください。「EOF」と表示されている場合、それが問題です。
  2. 各行の最後に LF がありますか? CR (\n, 0x0D) を試して、それが機能するかどうかを確認してください。
  3. まだ動作していません?LASTROW=2 を設定して再試行してください。次に、LASTROW=3 を試してください。ファイルに 3 つ以上の行があり、この手順が失敗した場合は、行ターミネータが機能していません。
于 2012-05-09T07:36:16.173 に答える
3

CHAR(10) が行ターミネータの場合、BULK INSERT のように引用符で囲むことはできないと思います。ただし、それを示す文書化されていない方法があります。

ROWTERMINATOR = '0x0A'
于 2012-05-09T00:51:32.783 に答える
1

私は同じ問題に遭遇しました。Linuxで.csvを作成するためのシェルスクリプトを作成しました。この.csvをWindowsに持っていき、データを一括ロードしようとしました。カンマが「好き」ではありませんでした。理由は聞かないでください。ただし、一括インポートで区切り文字として*に変更し、.csvでカンマの検索と置換を実行しました。 ..区切り文字として〜に変更しました。これは機能しました...タブも機能しました-コンマが気に入らなかった....これが誰かに役立つことを願っています。

于 2013-03-07T14:31:09.420 に答える
0

私の経験では、これはほとんどの場合、最後の 2 行の何かが原因です。 tailインポートファイルで、それでも失敗するはずです。次に、CR、LF、EOF などの非印刷文字を表示できるフル テキスト エディターで開きます。理由がわからなくても、それを動作させることができるはずです。例: BULK INSERT は最後の行の行ターミネータで失敗します

于 2014-08-13T19:18:07.347 に答える
0

すべてのフィールドを文字列に変換してから、共通の FIELDTERMINATOR を使用することで、この問題を回避しました。これはうまくいきました:

BULK INSERT [dbo].[workingBulkInsert]  
FROM 'C:\Data\myfile.txt' WITH (
   ROWTERMINATOR = '\n', 
   FIELDTERMINATOR = ',' 
)

私のデータファイルは次のようになります。

"01502","1470"
"01504","686"
"02167","882"
"106354","882"
"106355","784"
"106872","784"

2 番目のフィールドは、二重引用符で区切られていない 10 進数型 (1470.00 など) でした。両方を文字列としてフォーマットすると、エラーが解消されました。

于 2016-07-05T17:04:30.363 に答える
-4

このエラーを生成する行には CHAR(10)ターミネータがないか、不要なスペースがあります

于 2014-11-13T23:35:39.347 に答える