我必须导入 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 属性,但只有一条变形的线会杀死整个操作。如果我手动删除包含所有减号 (-) 的最后一行,一切正常。由于该导入将经常运行且特别无人看管,因此额外的后处理不是严肃的解决方案。
任何人都可以帮助我让 sql server 分别变得不那么挑剔和敏感。它记录了无法加载的行很好,但为什么它会中止整个操作?并且在执行导致创建 reject.txt 的语句之后,在手动删除 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>