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

Posted

技术标签:

【中文标题】bcp:错误 = [Microsoft][SQL Server Native Client 10.0]字符串数据,右截断【英文标题】:bcp: Error = [Microsoft][SQL Server Native Client 10.0]String data, right truncation 【发布时间】:2012-07-18 23:32:44 【问题描述】:

我最近在使用 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 "密码"

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

谢谢

肉桂女孩。

【问题讨论】:

你能说得更具体点吗? “相当大”是什么意思?您能否显示表定义的实际 CREATE TABLE 以及文件中较长行的一些示例? 好吧,Aaron,抱歉不够清楚。我的文件可能在 1000 KB 到 800,000KB 之间,具体取决于流量或高峰时段。我的表有示例列,例如 epoch_time(bigint)、server_id(varchar)、uid_rl(int)、apl(int),它们是标识列,而其他一些列分布在 int 和 float 之间。谢谢肉桂女孩 我不是要查看整个文件,或者像 varchar - varchar(what) 这样的模糊内容?输入是什么样的?您给我们一个模糊的错误消息,表明您正在尝试填充至少一个对其列来说太大的值,但您不会告诉我们表定义或向我们展示导致它的数据?您希望我们如何提供帮助?也许你可以打印出你的文件,把它放在飞镖靶上,然后向它扔飞镖,它会告诉你导致问题的价值?这就是您要求我们为您做的事情。 一定要使用bcp吗?您可以尝试导入和导出数据(64 位)(又名 DTS 向导)吗?您必须像 SSIS 一样精心指定数据格式,并且必须使用原始数据类型而不是 SQL 数据类型,但它确实工作得很好,并且允许您预览数据的解释方式。 确保架构/列匹配。您甚至可以考虑删除目标表并使用源表中的脚本重新创建它。 【参考方案1】:

我的 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!

【讨论】:

【参考方案2】:

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

MS SQL 不区分这两个字符。我删除了chr$(124),然后通过 BCP 导入工作正常。

【讨论】:

【参考方案3】:

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

【讨论】:

原谅我的天真,但是667,aa,bb怎么不符合int(4),char(2),char(2)呢? 抱歉,更新了帖子。【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

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

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

... ","    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...

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

我们在执行 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

【讨论】:

我的 csv 是在 Linux/php 中创建的,并以“LF”作为返回字符,并且使用 -r "0x0a" 为我工作! @MayankJha 我的文件即使使用 UNIX EOL 字符也没有加载,但它使用十六进制值作为换行符 - 很棒【参考方案8】:

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

【讨论】:

【参考方案9】:

我们发现我们尝试上传的文件是 Unicode 而不是 ANSI 格式。

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

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

见TechNet - Using Unicode Native Format to Import or Export Data

【讨论】:

好一个!我设法使用保存为 ANSI 的 csv 文件导入...但是在文件的某些点仍然出现一些截断错误...而且我在使用 BCP 时无法删除双引号封装...有什么想法吗? @PauloHenrique 抱歉,我没有解决方案。您可以更改分隔符,然后处理临时表中的字段。最近我刚刚将数据加载到 .Net DataSet 中,然后将其作为用户定义的表类型传递给存储过程,但这并不能带来很大的灵活性。当类型更改时,我最终也会对类型名称进行排序。它涉及更多,但更容易排除故障。对于临时的东西,我只是制作一个 XML 字符串,然后在存储过程中解析它,但如果有很多数据转换,有时很难排除故障。【参考方案10】:

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

【讨论】:

我不太明白你的分析。但是,对于换行提及 +1。就我而言,我们在数据中有换行符,这是 BCP 真正不喜欢的。

以上是关于bcp:错误 = [Microsoft][SQL Server Native Client 10.0]字符串数据,右截断的主要内容,如果未能解决你的问题,请参考以下文章

错误= [Microsoft] [SQL Server的ODBC驱动程序13]无法打开BCP主机数据文件

将数据批量加载到使用 BCP 从 SQL Server 导出的 Snowflake 时出现 UTF-8 错误

通过BCP导表数据的批处理

BCP 导出数据的问题 老是不成功 SQL2005

Postgres 在 SQL Server BCP 文件的最后一个预期列之后复制错误额外数据

当 BCP 失败时,Perl system() 命令不返回失败