bcp:错误= [Microsoft] [SQL Server Native Client 10.0]字符串数据,右截断

时间:2012-07-19 17:59:49

标签: sql-server-2008 sql-server-2008-r2 bcp

我最近在使用bcp时遇到错误。 这是错误。

  

SQLState = 22001,NativeError = 0错误= [Microsoft] [SQL Server   Native Client 10.0]字符串数据,右截断

我正在尝试将数据解压缩到没有任何约束的临时表中,并且与数据相比,数据类型也相当大。我有来自不同表的大约11个文件被bcp'd和压缩出来,当解包错误时只有一个文件。 这是我一直在成功使用的命令。最近(当试图制作当前WH的副本并设置过程时)我一直面临着问题。

  

employee_details.dat -n -E -S“servername”中的bcp.exe employee_details   -U sa -P“密码”

我尝试将命令更改为-C -T -S,当我手动提供格式时,这些命令有效。这是我需要加载到WH的非常重要的数据包。
我不知道我是否在这里看到格式文件。 需要任何帮助。

由于

肉桂女孩。

10 个答案:

答案 0 :(得分:14)

我们在执行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错误= [Microsoft] [SQL Server   Native Client 10.0]字符串数据,右截断“

BCP使用-r“\ n”或-r“\ r”选项将文件中的所有行视为单行,即使用以下命令

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

我们在BCP命令中使用Haxadecimal值(0x0a)表示新行字符时解决了问题

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

答案 1 :(得分:3)

对于我们来说,我们试图上传的文件是Unicode而不是ANSI格式。

有一个-N开关,但我们的表没有任何NVARCHAR数据。

我们刚刚以ANSI格式保存文件并且它有效,但是如果您有NVARCHAR数据或者您可能需要使用-N开关

请参阅TechNet - Using Unicode Native Format to Import or Export Data

答案 2 :(得分:2)

当有太多数据可以装入单个列时,会发生bcp右截断错误。 这可能是由不正确的格式文件(如果使用的话)或分隔符引起的。 行终止符(Windows有CRLF或'\ r \ n',UNIX有'\ n')也可能导致此错误。示例您的格式文件包含Windows CRLF,即'\ r \ n'作为行终止符,但文件包含'\ n'作为行结尾。这意味着将整个文件拟合为1行(而不是1列),这会导致右截断错误。

答案 3 :(得分: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...

答案 4 :(得分:1)

在我的情况下,原因是在一个字段中写了"|" = chr$(124),在我的情况下,分隔符是"|" = chr$(179)

MS SQL不会在两个字符之间产生区别。我取消了chr$(124),然后BCP的导入工作正常。

答案 5 :(得分:0)

在记事本++中打开文件。转到查看标签 - >显示符号 - >显示所有字符。我在.tsv文件中也遇到了同样的问题。一个标签放错了地方。

答案 6 :(得分:0)

我知道这是旧的 - 但我刚遇到一个实例,我收到此错误,结果我的一个数字字段有更多的小数,这是模式允许的。

答案 7 :(得分:0)

迟到了,但仍然:在我的情况下,我确实得到了这个

SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 11 for SQL Server]String data, right truncation

问题是架构已更改。目标数据库有两个新字段。安装完之前的架构后,导入成功。

答案 8 :(得分:0)

我的bcp忽略了任何换行符,例如\ r,\ n,\ r \ n \,0x0d,0x0a,0x0d0x0a等。我发现的唯一解决方法是将“真实的”换行符直接包含到bcp中命令。我认为这是可行的,因为csv是在与运行bcp的服务器相同的服务器上生成的。当我手动将csv传输到mssql服务器时,在批量插入中0x0a也可以正常工作。

请注意,nl1 = ^后必须加上两个新的空白行。

my_script.bat:

@echo off
setlocal enableDelayedExpansion

set nl=^


set cmd=bcp db_name.db_schema.my_table in stats.csv -w -t, -r "!nl!" -S my_server -U my_username -P password123
!cmd!

答案 9 :(得分:-1)

花费4个小时后,进行了大量的跟踪和错误处理,我发现解决方案可以像您要​​导入数据的表一样简单,应该为要导入的文件提供合适的架构。 例如:就我而言。我正在将具有 667,aaa,bbb 的.csv导入具有以下格式的表中 int(4),char(2),char(2)导致字符串数据右截断。