使用 BCP 不断出现导入错误 "String data, right truncation"

Keep getting import error "String data, right truncation" using BCP

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

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

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

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

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

我猜你的值比你在样本中看到的要大。您也可以尝试将 yoru 示例粘贴到一个新文件中……只是那些示例行并尝试加载它。如果可行,那么您会在文件中进一步了解您的架构未预料到的一些数据。可能是这样,或者您有一个奇怪的行终止符。你有一个好的文本文件查看器吗?一个显示通常隐藏在基本 "notepad" in Windows?

中的控制字符

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