2013-03-01 54 views
2

我已經完成了數據導入與SQL Server的BULK INSERT任務數百次,但這次我收到一個不熟悉的錯誤,並且我嘗試瞭解疑難解答Google無濟於事。以下是我在新行被新行字符表示逗號deliminated文件中使用的代碼:批量插入失敗「批量加載數據轉換錯誤(截斷)」

BULK INSERT MyTable 
FROM 'C:\myflatfile.txt' 
WITH (
    FIELDTERMINATOR = ',' 
    ,ROWTERMINATOR = '/n') 
GO 

它始終如一地努力,但現在有一個日期和速率的簡單的文件,它與失敗錯誤「消息4863,級別16,狀態1,行1批量加載數據轉換錯誤(截斷)爲第1行,第2列(ColumnTwo)。」當我查看文件時,我不明白爲什麼會失敗(通常Google故障排除表明分隔符可能存在多行,這會引發此錯誤)。從文件,這裏是第10行(注意,它無法在第一行):

1961-01-01,8.2 
1961-02-01,8.2 
1961-03-01,7.4 
1961-04-01,7.6 
1961-05-01,7.8 
1961-06-01,8.5 
1961-07-01,9.1 
1961-08-01,8.8 
1961-09-01,8.4 
1961-10-01,8.8 

表,我將這些數據轉換成有兩個字段thare是VARCHAR(50),即使當我最初看到截斷我擴大了數據字段到VARCHAR(2000),它並沒有影響它。

CREATE TABLE MyTable (
    ColumnOne VARCHAR(50), 
    ColumnTwo VARCHAR(50) 
) 

我也試圖消除所有的破折號,看看是否被搞亂的東西(雖然我已經做了充足的數據進口使用相同的代碼破折號和它的作品沒有錯誤),它仍然收到相同的錯誤信息。

與SSIS一樣,直接導入工作(通過Tasks),但該代碼失敗了,因爲它應該完成同樣的事情?

回答

11

由於文件格式,問題很可能是行終止符不工作。

嘗試:

ROWTERMINATOR = '0x0a' 

編輯

其實我剛纔注意到您使用的斜線,它應該是反斜槓,所以這可能工作:

ROWTERMINATOR = '\n' 
+0

謝謝;我怎麼能區分它是'/ n'還是'0x0a',就像文件中它看起來是一個新的行字符一樣?在此之前我沒有看過這個。 – Tim 2013-03-01 15:37:53

+0

如果您的文件來自基於UNIX的系統,則應該正常使用'0x0a'(因爲UNIX僅使用\ n - 換行符作爲終止符)。如果你的文件是基於Windows的,即使你只指定了\ n(這是回車和換行符),bulkcopy實際上也會使用\ r \ n。 – EkoostikMartin 2013-03-01 15:43:50

2

從SQL Server Management Studio中(SSMS),對於Unix風格的文件,ROWTERMINATOR ='0x0a'起作用。但是,ROWTERMINATOR ='\ n'並不是因爲SSMS明顯將\ n解釋爲Windows風格的序列末尾(\ r \ n)併爲您修復/打破它。有趣的是,如果您通過SQL Server JDBC驅動程序從Java代碼發送相同的ROWTERMINATOR ='\ n',則它將被視爲Unix風格的行尾,因爲中間沒有任何內容會引發額外\ r。

所以,你必須做兩件事情:

1 - 確保你瞭解你的數據文件實際上是如何做結束線。

2 - 確保您瞭解將BULK INSERT sql傳遞給SQL Server的方式是如何解釋任何轉義序列。我有限的經驗是,對於SQL Server SQL,使用十六進制('0x0a')可在所有環境中使用。