使用BCP不断收到导入错误“字符串数据,正确的截断”

时间:2018-11-06 18:40:00

标签: sql sql-server bcp

我遇到了一个问题。我正在尝试使用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

2 个答案:

答案 0 :(得分:0)

某些事情肯定会被截断。从来没有见过这个错误是错的。唯一的原因是由于多种原因数据会被截断。

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

我的猜测是,您的值比示例中看到的值大。您也可以尝试将yoru样本粘贴到新文件中……仅是那些样本行,然后尝试加载它。如果这行得通,那么您会在文件中进一步获取一些数据,这些数据是您的体系结构无法预期的。可能是这样,或者您有一个奇数行终止符。您有一个好的文本文件查看器吗?可以显示通常隐藏在Windows基本“记事本”中的控制字符吗?

答案 1 :(得分:0)

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