2012-07-19 392 views
9

我最近在使用bcp時遇到錯誤。 這是錯誤。bcp:錯誤= [Microsoft] [SQL Server Native Client 10.0]字符串數據,右截斷

SQLSTATE = 22001,NativeError = 0錯誤= [微軟] [SQL Server的 本機客戶端10.0]字符串數據,右截斷

我試圖解開數據到一個臨時表,沒有任何約束,數據類型與數據相比也相當大。我有大約11個來自不同表格的文件被打包出來,並且在打開錯誤時只有一個文件被壓縮出來。 這是我一直使用的命令。最近(當試圖複製當前的WH並設置過程時),我一直面臨着問題。

的Bcp.exe employee_details在employee_details.dat -n -E -S 「服務器名」 -U SA -P 「密碼」

我試圖改變的命令爲-C -T - 當我手動輸入格式時它工作。這是我需要加載到我的WH中的一個非常大而重要的數據包。
我不知道我是否在這裏看到格式文件。 需要任何幫助。

謝謝

肉桂女孩。

+0

請問您能更具體些嗎? 「相當大」是什麼意思?您能否爲表定義顯示實際的CREATE TABLE,以及文件中較長行的幾個樣本? – 2012-07-19 18:12:04

+0

好吧,亞倫,對不起,不夠清楚。我的文件可以在1000KB到800,000KB之間,具體取決於流量還是高峯時段。我的表的示例列爲epoch_time(bigint),server_id(varchar),uid_rl(int),apl(int),它們是標識列和其他一些分佈在int和float之間的列。謝謝肉桂女孩 – 2012-07-19 19:42:30

+0

我不是要求查看整個文件,或者像'varchar' - 'varchar(what)'這樣的含糊的東西嗎?輸入是什麼樣的?你給我們提供了一個模糊的錯誤信息,表明你正在嘗試填充至少一個對於列來說太大的值,但是你不會告訴我們表的定義或者向我們顯示導致它的數據?你如何期望我們提供幫助?也許你可以打印出你的文件,把它放在飛鏢盤上,並向它扔飛鏢,它會告訴你導致問題的價值?這就是你要求我們爲你做的。 – 2012-07-19 19:44:57

回答

2

bcp右截斷錯誤發生在可以裝入單個列的數據太多時。 這可能是由不正確的格式文件(如果有的話)或分隔符引起的。 行結束符(Windows具有CRLF或'\ r \ n',UNIX具有'\ n')也會導致此錯誤。示例您的格式文件包含Windows CRLF,即'\ r \ n'作爲行終止符,但該文件包含'\ n'作爲行結束符。這意味着將整個文件放入1行(而不是1列),這會導致右截斷錯誤。

+0

我不太瞭解你的分析。但是,換行提到+1。對於我的情況,我們在數據中有換行符,BCP真的不喜歡。 – Richard 2014-08-28 16:51:26

3

對我們來說,我們試圖上傳的文件是Unicode而不是ANSI格式。

有一個-N開關,但我們的表沒有任何NVARCHAR數據。

我們只保存在ANSI格式的文件,它的工作,但如果你有NVARCHAR數據,或者您可能需要使用-N開關

TechNet - Using Unicode Native Format to Import or Export Data

+0

好的!我設法使用以ANSI保存的csv文件導入...但是在文件的某個點仍然會出現一些截斷錯誤......我也無法在使用BCP時刪除雙引號封裝....任何想法? – 2017-06-02 19:13:54

+0

@PauloHenrique對不起,我沒有解決方案。您可以更改分隔符,然後處理臨時表中的字段。最近我剛剛將數據加載到.Net數據集中,然後將其作爲用戶定義表類型傳遞給存儲過程,但這不適用於很大的靈活性。當類型改變時,我也最終對類型名稱進行排序。它涉及更多,但更容易排除故障。對於特別的東西,我只是創建一個XML字符串,然後在存儲過程中解析它,但是如果有大量數據轉換,有時很難排除故障。 – 2017-06-06 12:37:55

0

打開文件在記事本++。轉到查看選項卡 - >顯示符號 - >顯示所有字符。我在.tsv文件中也面臨同樣的問題。一個選項卡放錯了位置。

12

我們在執行BCP時也遇到了同樣的問題,並且它變成了.dat文件中換行符的問題。

在Notepad ++中查看文件,然後單擊「顯示所有字符」以查看新行字符。

File with LineFeed character

BCP引發以下錯誤與-r爲 「\ r \ n」 個選項,即用下面的命令

bcp dbo.Test in C:\Test.dat -c -t "|" -r "\r\n" -S "DBServerName" -T -E 

「的SQLState = 22001,NativeError = 0錯誤= [微軟] [SQL Server的 本機客戶端10.0]字符串數據,右截斷」

BCP治療中的所有行文件作爲單行-r「\ n」或IE瀏覽器下面的命令-r「\ r」選項,當我們用牛逼

bcp dbo.Test in C:\Test.dat -c -t "|" -r "\n" -S "DBServerName" -T -E 

問題就解決了他Haxadecimal值(0X0A)在BCP命令新行字符

bcp dbo.Test in C:\Test.dat -c -t "|" -r "0x0a" -S "DBServerName" -T -E 
+0

我的csv是在Linux/PHP中創建的,具有「LF」作爲返回字符,並使用「-r」0x0a「'爲我工作! – 2015-01-15 18:31:53

+0

很高興知道它幫助你..乾杯! – 2015-01-19 06:11:52

+0

@MayankJha即使使用UNIX EOL字符,我的文件仍然沒有加載,但它使用十六進制值處理新行字符 - 輝煌 – Ali 2017-04-04 06:19:17

0

我知道這是舊的 - 但我只是碰到這樣的情況:我得到這個錯誤來了,原來我的數字領域之一有更多的模式允許的小數位數。

2

我還收到截斷消息。經過幾個小時的搜索論壇,並嘗試建議的解決方案,我終於得到我的負載工作。

截斷消息的原因是因爲我足夠容易認爲將列名放在格式文件中實際上很重要。這是前面的數字,似乎決定數據的加載位置。

我的輸入文件沒有表中第三列的數據。所以這就是我的格式文件的樣子。

... "," 1 Cust_Name  SQL_Latin1... 
... "," 2 Cust_Ref  SQL_Latin1... 
... "," 3 Cust_Amount  SQL_Latin1... 
... "\r\n" 4 Cust_notes SQL_Latin1... 

我的輸入文件是這樣的:

Jones,ABC123,200.67,New phone 
Smith,XYZ564,10.23,New SIM 

表看起來像

Cust_Name Varchar(20) 
Cust_Ref Varchar(10) 
Cust_Type Varchar(3) 
Cust_amount Decimal(10,2) 
Cust_Notes Varchar (50) 
Cust_Tel Varchar(15) 
Cust...... 

我想通過在格式文件中的數據會去給列名假設放到桌子上的相應列中。

然而,這是因爲列號很重要,列名是噪音。

... "," 1 A  SQL_Latin1... 
... "," 2 B  SQL_Latin1... 
... "," 4 C  SQL_Latin1... 
... "\r\n" 5 D  SQL_Latin1... 
相關問題