2012-07-19 399 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... 
相关问题