今天在一台SQL 2000上做BULK INSERT,語法是

BULK INSERT PicLibrary
FROM 'C:\Output\PicInfo.txt'
WITH
(
    BATCHSIZE = 1000,
    FIELDTERMINATOR = '\t',
    ROWTERMINATOR = '\n',
    TABLOCK
)

我之前在SQL 2005上做過同樣的事,但這回在SQL 2000上卻一直爆出錯誤:

訊息 4866,層級 16,狀態 1,行 10 大量載入失敗,資料檔案的資料行對於資料列1,資料行4而言太長。請確定已指定正確的欄位結束字元和資料列結束字元。
(英文: The bulk load failed. The column is too long in the data file for row 1, column 4. Verify that the field terminator and row terminator are specified correctly.)
訊息 7399,層級 16,狀態 1,行 10 OLEDB Provider 'MyServer'報告了錯誤。提供者並未給予任何關於錯誤的資訊。 OLEDB錯誤追蹤[OLEDB Provider 'MyServer' IRowset::GetNextRows returned 0x80004005: 提供者並未給予任何關於錯誤的資訊。]。
(英文: The OLE DB provider "BlBULK" reported an error. The provider did not give any information about the error.)

反覆嘗試,耗了好幾個小時。最後Google到這篇討論,情境跟我的很像,都是用Import Data會成功,直接在Query Analyzer BULK INSERT卻出錯,但差別在於我用的是SQL 2000,該案例則是在SQL 2005上,因此文中的Hotfix無濟於事。

又看了幾篇文章,有人提到\n .vs. \r\n的問題,我試著將欄分隔符號改為",",列分隔符號改為";",改用後就一次OK!!

我認為這是SQL 2000的Bug,不過SQL 2008都快出來了,不大想花時間跟這隻老恐龍拼命,就此打住。把我的經驗整理如下:

【情境】

  1. BULK INSERT時遇到上述錯誤
  2. 同一檔案用Import Data匯入卻無誤
  3. 使用了'\t'分欄,'\r\n'或'\n'分列

【解決方式】

將\t, \n換成其他符號。

PS: SQL 2005 User則可試試
FIX: 當您在 Microsoft SQL Server 2005 執行 BULK INSERT 陳述式錯誤訊息: " The 大量載入失敗。 資料行是針對 <n>, <n> 個資料行資料列將資料檔中的 "blah" 太長
http://support.microsoft.com/kb/942660/zh-tw


Comments

# by Johnny

這倒讓我回想起以前遇到的問題(雖然不一定是同樣的問題,還是拿出來供做參考)。我之前遇到的問題是,我拿一個輸出的文件 (.csv) 給一家日本公司匯入資料庫,但對方一直反映失敗,後來我靈機一動,把 Delimeter 從 "," 改成 ";" 果然解決了。經反覆測試之後,才知道資料裡面有一兩行文字裡面有 "aabb, ccdd" (文字裡面也有逗點符號),結果對方資料庫就沒辦法讀。不曉得這裡是否也是類似的問題。

# by Jeffrey

To Johnny, 謝謝你的分享。 我有懷疑過你所說的原因,不過我觀察到一個有趣的現象: 我如果修改BATCHSIZE的大小,錯誤訊息中出錯的那一列也會跟著變化,而且出錯列看起來正常,沒看到多餘的\t。我當跟據這一點排除了前述原因而斷定是Bug的成份居多。

# by minmin

請大大看一下我在小舖上的問題: Bulk Update? http://www.blueshop.com.tw/board/show.asp?subcde=BRD20080826210117F70&fumcde=

Post a comment