我必须导入SAP未兑换的列表。这些报告看起来相当难看,并不适合自动化处理。但是没有其他选择。SQL SERVER批量插入忽略变形行
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
不幸的是我收到follwing错误代码:
数据是围绕类似于下面的例子中减去和管道符号borderdMsg 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>
当我使用具有固定列宽的格式文件(CharFixed而不是CharTerm)时,我发现更好的支持。然后,您可以在where子句中检查预期内容的某些列。但是,由于SAP会改变列的宽度,所以在我的用例中这不是一个选项。 – Toby
很遗憾地看到,SQL Server似乎无法处理并非100%符合所提供格式的行。为什么不能忽略并记录行,然后继续而不是立即中止整个导入。更糟糕的是,一种错误文件被创建,并且只要存在一个错误文件(不会被用户或外部程序删除),就不能再启动了!专业软件不是那种奇怪的行为吗? – Toby