3

SAPの非コンバージドリストをインポートする必要があります。これらのレポートは非​​常に見苦しく、自動処理にはあまり適していません。ただし、他のオプションはありません。データは、次の例のようにマイナス記号とパイプ記号で囲まれています。

02.07.2012
--------------------
Report name
--------------------
|Header1 |Header2  |
|Value 11|Value1 2 |
|Value 21|Value2 2 | 
--------------------

次のようなフォーマットファイルとステートメントを使用します。

SELECT Header1, Header2
FROM  OPENROWSET(BULK  'report.txt',
FORMATFILE='formatfile_report.xml'  ,
errorfile='rejects.txt',
firstrOW = 2,
maxerrors = 100 ) as report

残念ながら、次のエラーコードが表示されます。

Msg 4832, Level 16, State 1, Line 1
Bulk load: An unexpected end of file was encountered in the data file.
Msg 7399, Level 16, State 1, Line 1
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 1
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".

txtファイルの拒否には、ファイルの最後の行にマイナスが含まれています。rejects.txt.Error.Txtドキュメント:

Row 21550 File Offset 3383848 ErrorFile Offset 0 - HRESULT 0x80004005

エラーを発生させる原因は、明らかに、フォーマットファイルで宣言されているフォーマットに準拠していない最後の行です。ただし、醜いヘッダーは多くの問題を引き起こしません(少なくとも一番上にあるもの)。

maxerror属性を定義しましたが、1つの変形した行が操作全体を強制終了します。すべてのマイナス(-)を含む最後の行を手動で削除すると、すべて正常に機能します。そのインポートは頻繁に実行され、特に無人で行われるため、追加の後処理は深刻な解決策ではありません。

誰かが私がSQLサーバーをそれぞれうるさくなく、影響を受けにくくするのを手伝ってくれますか?ロードできなかった行を文書化するのは良いことですが、なぜ操作全体を中止するのですか?さらに、reject.txtの作成を引き起こしたステートメントを1回実行した後、txtファイルが手動で削除されるまで、他の(または同じ)ステートメントを実行することはできません。

Msg 4861, Level 16, State 1, Line 1
Cannot bulk load because the file "rejects.txt" could not be opened. Operating system error code 80(The file exists.).
Msg 4861, Level 16, State 1, Line 1
Cannot bulk load because the file "rejects.txt.Error.Txt" could not be opened. Operating system error code 80(The file exists.).

それは変な振る舞いだと思います。それを抑えるのを手伝ってください。

編集-フォローアップ: これが私が使用するフォーマットファイルです:

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" 
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <RECORD>
   <FIELD ID="EMPTY" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="100"/>
   <FIELD ID="HEADER1" xsi:type="CharTerm" TERMINATOR="|" MAX_LENGTH="100"/>
   <FIELD ID="HEADER2" xsi:type="CharTerm" TERMINATOR="|\r\n" MAX_LENGTH="100"/>
 </RECORD>
 <ROW>
   <COLUMN SOURCE="HEADER1" NAME="HEADER2" xsi:type="SQLNVARCHAR"/>
   <COLUMN SOURCE="HEADER2" NAME="HEADER2" xsi:type="SQLNVARCHAR"/>
 </ROW>
 </BCPFORMAT>
4

3 に答える 3

5

BULK INSERT提供された仕様を満たさないデータの処理に関しては、面倒で役に立たないことで有名です。

私はフォーマット ファイルを使って多くの作業を行ったことはありませんが、代わりに考慮したいことの 1 つは、ファイルの各行を 1 つの列BULK INSERTを持つ一時的なステージング テーブルにドロップすることです。nvarchar(max)

これにより、さらに調査するためにデータを SQL に取り込むことができ、その後、さまざまな文字列操作関数を使用して、最終的に挿入するデータに分解できます。

于 2012-07-04T01:02:56.513 に答える
0

私は同じ問題を抱えていましたが、bcpコマンドラインを使用して問題を解決しました。最後の行を取得しないだけです

于 2016-09-20T21:04:07.730 に答える
0

私も同じ問題を抱えていました。1,150 億行のファイルがあったため、ファイルが大きすぎて手動で開くことさえできなかったため、最後の行を手動で削除することはできませんでした。

BULK INSERT コマンドを使用する代わりに、次のような bcp コマンドを使用しました: (管理者で DOS コマンドを開き、書き込みます)

bcp DatabaseName.dbo.TableNameToInsertIn in C:\Documents\FileNameToImport.dat -S ServerName -U UserName -P PassWord

私が知る限り、一括挿入とほぼ同じ速度です (データをインポートするのに 12 分しかかかりませんでした)。アクティビティ モニターを見ると、一括挿入が表示されるので、データベースが一括復旧モードの場合と同じようにログに記録されていると思います。

于 2017-10-06T15:53:26.193 に答える