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>