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 属性,但只有一条变形的线会杀死整个操作。如果我手动删除包含所有减号 (-) 的最后一行,一切正常。由于该导入将经常运行且特别无人看管,因此额外的后处理不是严肃的解决方案。

任何人都可以帮助我让 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>
4

3 回答 3

5

BULK INSERT在处理不符合所提供规范的数据时,这是出了名的繁琐和无益。

我没有对格式文件做很多工作,但是您可能要考虑替换的一件事是使用BULK INSERT将文件的每一行放入具有单列的临时登台表中nvarchar(max)

这使您可以将数据放入 SQL 中以供进一步检查,然后您可以使用各种字符串操作函数将其分解为最终要插入的数据。

于 2012-07-04T01:02:56.513 回答
0

我遇到了同样的麻烦,但是使用 bcp 命令行问题解决了,它根本不占用最后一行

于 2016-09-20T21:04:07.730 回答
0

我有同样的问题。我有一个包含 1150 亿行的文件,因此无法手动删除最后一行,因为我什至无法手动打开该文件,因为它太大了。

我没有使用 BULK INSERT 命令,而是使用了 bcp 命令,如下所示:(在管理员中打开 DOS cmd 然后写入)

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

据我所知,它与批量插入的速度差不多(我只花了 12 分钟来导入我的数据)。在查看活动监视器时,我可以看到批量插入,所以我猜它在数据库处于批量恢复模式时以相同的方式记录。

于 2017-10-06T15:53:26.193 回答