我必須導入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