19

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

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

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

bcp.exe employee_details in employee_details.dat -n -E -S "servername" -U sa -P "Password"

我尝试将命令更改为 -C -T -S ,当我手动提供格式时它起作用了。这是一个非常大且重要的数据包,我需要将其加载到我的 WH 中。
我不知道我是否在这里看到了格式文件。需要任何帮助。

谢谢

肉桂少女。

4

10 回答 10

20

我们在执行 BCP 时也遇到了同样的问题,结果证明是 .dat 文件中的换行符问题。

在 Notepad++ 中查看该文件,然后单击“显示所有字符”以查看换行符。

带有换行符的文件

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 命令中为换行符使用十六进制值 (0x0a) 时,问题已解决

bcp dbo.Test in C:\Test.dat -c -t "|" -r "0x0a" -S "DBServerName" -T -E
于 2015-01-06T06:45:57.463 回答
3

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

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

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

请参阅TechNet - 使用 Unicode 本机格式导入或导出数据

于 2013-12-17T15:40:04.410 回答
3

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

于 2013-08-31T18:28:06.510 回答
3

我也收到了截断消息。经过数小时搜索论坛并尝试建议的解决方案后,我终于开始工作了。

截断消息的原因是因为我很容易相信将列名放在格式文件中实际上很重要。前面的数字似乎指示数据的加载位置。

我的输入文件没有表中第三列的数据。所以这就是我的格式文件的样子。

... ","    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...
于 2016-08-19T11:50:51.830 回答
1

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

MS SQL 不会在两个字符之间产生差异。我消除了chr$(124)然后通过 BCP 导入工作正常。

于 2019-04-13T09:12:10.940 回答
1

我知道这很旧 - 但我刚刚遇到了一个我收到此错误的实例,结果发现我的一个数字字段具有更多架构允许的小数。

于 2015-09-16T19:41:01.850 回答
0

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

于 2014-09-13T11:25:11.490 回答
0

迟到了,但仍然:就我而言,我确实得到了这个

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

问题是架构发生了变化。目标数据库有两个新字段。一旦我安装了以前的模式,导入就成功了。

于 2018-03-23T13:51:56.290 回答
0

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

于 2018-07-30T20:17:20.763 回答
0

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

请注意,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!
于 2020-06-12T06:56:52.817 回答