【问题标题】:Keep getting import error "String data, right truncation" using BCP使用 BCP 不断收到导入错误“字符串数据,右截断”
【发布时间】:2019-04-10 04:57:34
【问题描述】:

我遇到了一个问题。我正在尝试使用 BCP 将大约 700,000 条记录导入工作表。

这是我用来构建工作表的 SQL:

If Exists (Select * From sys.tables Where [name] = 'InactiveIDs')
    Begin 
        Drop Table [dbo].[InactiveIDs]
    End

Create Table [dbo].[InactiveIDs] (
    ContactId UniqueIdentifier Not Null,
    ID Varchar(50),
    EmailAddress VarChar(255) Not Null
)

Create Index IX_ContactIdEmailAddress
    On [dbo].[InactiveIDs] (ContactId, EmailAddress)

这是格式文件文件:

13.0
3
1       SQLUNIQUEID         1       36      ","        1     ContactId                    ""
2       SQLCHAR             2       50      ","        2     ID                           SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR             2       255     "\r\n"     3     EmailAddress                 SQL_Latin1_General_CP1_CI_AS

这是一些示例数据:

CBD60121-C5E1-E511-B2B4-005056820129,199e6799e3c64b06a87e86a5047e5f41,someone@verizon.com
3D22A4C2-507B-E411-99C7-005056820126,76410ce5beab4a7da943b95b3de3b0c1,someone@gmail.com
AE5B9335-B126-E611-ABF2-005056820020,e7d181abdf154f79b5dcaa4d64fec7f7,someone@yahoo.com
93F94F65-FA2A-E311-87A7-005056B5025F,3e2fae28cace4f068fa670879d7807e3,someone@juno.com
0A41305C-C087-E411-A37D-00505682001E,55b0162742b04a369c1c57d8d917d45c,someoneelse@yahoo.com

这是我的命令行:

bcp.exe dbo.InactiveIDs in InactiveIDs.csv -f InactiveIDs.bcp.fmt -T -S SqlServerName -d DatabaseName

这是输出:

Starting copy...
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation

BCP copy in failed

【问题讨论】:

  • 你看这篇文章了吗? stackoverflow.com/questions/11566658/…
  • 我做了,@DanielBlais,但没有发现它很有帮助。 :(
  • 你确定你的行尾是windows风格的\r\n
  • 1) 文件是用什么字符集写入的?假设它在一个文件中? 2) 我看到 10 条错误消息,但这些错误消息是针对记录 1-10 还是针对记录 9990-9999?
  • 您可以增加 ID 和 EmailAddress 的大小,以确保您不必记录大于列大小的记录。

标签: sql sql-server bcp


【解决方案1】:

某些东西肯定会被截断。从来没有见过这个错误是错误的。唯一的问题是数据可能会因为几个不同的原因而被截断。

  1. 您的列大小似乎足够了。但是,这只是您共享的示例数据。如果这是一个非常大的文件,其他一些值是否可能比您的样本长? BCP 是否完成任何批次? (您是否一遍又一遍地看到“1000 条记录……”?)
  2. 分隔符可能有问题。如果您指定的分隔符(列或行分隔符)与文件中的实际内容不匹配……那么 SQL Server/BCP 将继续摄取数据,直到找到您告诉它查找的分隔符。您似乎正在使用逗号,并且您的示例数据有它们......但是行终止符?你确定是CRLF?有时我会看到只有 LF 的文件,甚至是其他一些奇怪的、不可见的控制字符。
  3. 无论您发现上面提到的 1 和 2 是什么,都应该使用 -e 选项包含一个错误文件。这是一个非常方便的输出,它将为您提供行号和任何违规行的数据。只返回前 10 个错误的行。

我的猜测是您的值比您在样本中看到的值更大。您也可以尝试将 yoru 示例粘贴到一个新文件中……只是那些示例行并尝试加载它。如果这可行,那么您将在文件中进一步保留一些您的架构没有预料到的数据。可能是这样,或者你有一个奇怪的行终止符。你有一个好的文本文件查看器吗?一种显示通常隐藏在 Windows 基本“记事本”中的控制字符?

【讨论】:

    【解决方案2】:

    Microsoft 官方文档解释了Non-XML Format File 的组成部分。 我看到您的 2 个可能的问题,都与第一个字段有关:
    1. 第 4 列(主机文件数据长度)应为 37,如果您打开解释每种数据类型的页面并转到 uniqueidentifier,它会显示 37 - 现在我将样本数据中的值复制到第一个逗号到记事本和它们有 37 个字符长。
    2. 可能SQLUNIQUEID类型也错了,应该是SQLCHAR。该文档说,对于第 2 列和第 3 列,它们应该与用于提取的那些相同。我不知道提取是否使用本机数据类型完成,但在我看来,第一个字段也是文本。因此,如果第 1 点修改仍然失败,我将尝试使用所有字段的前缀长度为零的 SQLCHAR。

    【讨论】:

    • 这是唯一标识符的长度。谢谢!
    猜你喜欢
    • 2016-05-28
    • 1970-01-01
    • 2021-07-03
    • 2012-07-18
    • 2020-07-26
    • 2019-10-01
    • 2015-04-05
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多