2014-06-27 57 views
0

我正在嘗試使用批量插入上傳一個非常大的數據文件(5M行)。所有列都只是varchars沒有轉換。所以格式文件很簡單...SQL Server批量插入固定寬度的文件失敗

11.0 
29 
1 SQLCHAR  0 8 "" 1 AccountId  "" 
2 SQLCHAR  0 10 "" 2 TranDate  "" 
3 SQLCHAR  0 4 "" 3 TransCode  "" 
4 SQLCHAR  0 2 "" 4 AdditionalCode  "" 
5 SQLCHAR  0 11 "" 5 CurrentPrincipal "" 
6 SQLCHAR  0 11 "" 6 CurrentInterest  "" 
7 SQLCHAR  0 11 "" 7 LateInterest  "" 
... 
27 SQLCHAR  0 8 "" 27 Operator  "" 
28 SQLCHAR  0 10 "" 28 UpdateDate  "" 
29 SQLCHAR  0 12 "" 29 TimeUpdated  "" 

但每一次,在某些時候,我得到了同樣的錯誤:

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)".

我曾嘗試以下:

Bulk Insert 
    [TableName] From 'dataFilePPathSpecification' 
    With (FORMATFILE = 'formatFilePPathSpecification') 

但大約5-6分鐘後出現錯誤,並且沒有插入任何數據。

當我添加BatchSize參數時,在接近文件結尾的很長時間之後,除了極少數行已經插入成功之外,我得到了錯誤。

Bulk Insert 
    [TableName] From 'dataFilePPathSpecification' 
    With (BATCHSIZE = 200, 
      FORMATFILE = 'formatFilePPathSpecification') 

當我設置BATCHSIZE到2000年它運行得更快,(更少,更大的transacxtions我認爲),但它仍然失敗。

這是否與大容量插入如何識別文件結尾有關?如果是這樣,我需要對格式文件進行修復?

回答

1

明確說明你行終止:

BULK INSERT TableName FROM 'Path' 
     WITH (
      DATAFILETYPE = 'char', 
      ROWTERMINATOR = '\r\n' 
      With (FORMATFILE = 'formatFilePPathSpecification') 
    ); 

如果這仍然失敗,請檢查您的文件,看看是否有嵌入文本字段意外終止。

+0

我的數據文件是一個固定寬度的文件,沒有字段終止符,但是你是什麼意思的'線路'和'行'終止符,這是同樣的事情,不是? - 或者你只是在說錯話? –

+0

手指比腦子快。 :) –

+0

認爲是這樣的...那麼你說得對,那就修正了它......但是我必須爲行(最後一個字段)終結符「\ r \ n」 –

1

使用錯誤文件說明符在與份量找到有問題的數據嘗試:

錯誤文件=「C:\ offendingdata.log」

1

如果仍然甚至啓用錯誤文件輸出後有問題,你可以通過設置FirstRow和LastRow選項並反覆運行批量插入操作來解決問題,從而實現二進制搜索。

說實話,你的輸入格式看起來很簡單,編寫一個小小的C#,Python或其他什麼漂浮你的船應用程序來質量檢查你的數據在嘗試導入之前可能是一個好主意。您可以簡單地丟棄無效行(或者可能修復它們),或者將它們寫入異常文件以進行手動處理,或者簡單地停止作業 - 即,文件必須完美或者被認爲已損壞。以這種方式驗證5M行將非常快 - 基本上可以像讀取文件(以及可能寫入文件)一樣快。

0

感謝大家的建議,我應用了兩個想法......我寫了一個小的.Net(c#)文件處理器實用程序,它告訴我還有額外的空值(二進制零(\ 0)行,我能帶他們過使用一個簡單的C#程序。

錯誤文件指出的問題是在最後,(這是錯誤味精說的話!)

實際的問題是,大容量插入無法識別EOF ..我不得不修改格式文件這樣修復它..然後它的工作。

11.0 
29 
1 SQLCHAR  0 8 ""  1 AccountId  "" 
2 SQLCHAR  0 10 ""  2 TranDate  "" 
3 SQLCHAR  0 4 ""  3 TransCode  "" 
4 SQLCHAR  0 2 ""  4 AdditionalCode "" 
5 SQLCHAR  0 11 ""  5 CurrentPrincipa "" 
6 SQLCHAR  0 11 ""  6 CurrentInterest "" 
7 SQLCHAR  0 11 ""  7 LateInterest "" 
... 
27 SQLCHAR  0 8 ""  27 Operator  "" 
28 SQLCHAR  0 10 ""  28 UpdateDate  "" 
29 SQLCHAR  0 12 "\r\n" 29 TimeUpdated  ""