文本被截断或一个或多个字符在目标代码页中找不到,包括在非旋转表中的主键。

77

我正在尝试将一个扁平文件导入到oledb目标sql server数据库中。

这是困扰我的字段:

图片描述

这是该扁平文件连接的属性,特别是字段:

图片描述

这是错误信息:

[源-18942979103_txt [424]] 错误: 数据转换失败。列“recipient-name”的数据转换返回了状态值4和状态文本“文本被截断或一个或多个字符在目标代码页中没有匹配项。”。

我做错了什么?


2
“Text was truncated…” 似乎暗示导入的文件中该列可能有一个超过100个字符的值……至少值得一看。 - Conduit
4
不,情况并非如此,我确实进行了检查。 - Alex Gordon
2
将行重定向到错误输出并发送到派生列或其他不需要配置的位置。然后添加数据查看器,尝试查找出错的行。可能是其他某一列中有制表符,这会使事情变得混乱。或者前一行没有正确结束。 - Mark Wojciechowicz
@MarkWojciechowicz 谢谢。你所说的数据查看器是什么意思?那是一个控件吗? - Alex Gordon
@yuck 数据查看器是一种工具,允许您在调试期间查看数据。右键单击两个组件之间的箭头,然后选择添加数据查看器(在此情况下为错误流)。然后运行包。当行发送到该缓冲区时,将弹出一个窗口。 - Mark Wojciechowicz
显示剩余3条评论
12个回答

102
这是我解决问题的方法。我不需要转换为Excel。只需在选择数据源时修改DataType为“text stream”(图1)。您还可以检查“编辑映射”对话框以验证大小的更改(图2)。 图1 输入图像描述 图2 输入图像描述

注意:我首先必须将数据类型更新为 VARCHAR(MAX),然后进入高级屏幕并将导入更新为 5000 个字符。 - Nahuatl_C137
2
适用于我,但还必须在“平面文件源”步骤中将代码页从“1252(ANSI-Latin I)”更改为“65001(UTF-8)”,否则仍会出现相同的错误。尝试了一系列解决方案来导入超过100万行数据(因此无法使用Excel),这个方法与上述切换到文本流的解决方案结合使用效果很好。 - Robin Wilson

34

在尝试增加长度或者将数据类型更改为文本后仍然失败,我通过创建XLSX文件并导入解决了这个问题。它准确地检测到了数据类型,而不是将所有列设置为varchar(50)。结果发现对于该列来说,nvarchar(255)也可以解决问题。


5
当你的数据量过大无法处理于Excel时,应该如何处理? - BallpointBen
1
将数据类型转换为nvarchar(255)并没有起作用。我仍然收到异常。我使用SQL插入,它运行得很好,字符串长度只有51个字符。 - Arjun Menon
我选择使用导入平面文件而不是导入数据,这样就没有任何问题了。我注意到的一件事是,在使用导入数据选项时出现问题的列,列大小为50(内容大小为51),而在使用导入平面文件时,列大小设置为100。 - Arjun Menon

20
我通过对源数据(xls,csv或其他)进行排序解决了这个问题,使得文件中最长的文本值位于顶部。在 Excel 中,您可以使用LEN()函数对具有挑战性的列进行计算。根据长度值进行排序,并将最长值放在数据集的顶部。保存后,尝试重新导入。

2
我的导入在大约3000个字符的数据时失败了,而这种方法修复了导入错误。 - John Lieb-Bauman

9

我通过勾选“UNICODE”复选框来解决了这个问题。请点击下面的图像链接:

图像



7

虽然上面提出的方法(@chookoos,在这个问题和答案中将其转换为Excel工作簿并导入)可以解决这些问题,但是这个另一个问题和答案中的解决方案很棒,因为您可以使用csv、tsv或txt文件,并且进行必要的微调,而无需创建与Microsoft产品相关的解决方案 enter image description here enter image description here


7

SQL Server可能会为您建议正确的数据类型(即使默认情况下它没有选择正确的类型)- 点击“建议类型”按钮(如上面的截图所示),可以让SQL Server扫描源并建议一个数据类型,用于解决引发错误的字段。在我的情况下,选择扫描20000行以生成建议,并使用生成的建议数据类型解决了问题。


6

在导入特定列的数据时,您需要增加该列的长度。

选择数据源 >> 高级选项 >> 将该列的默认长度从50增加到200或更多。


5

这并不是一个技术性的解决方案,但SQL Server 2017的扁平文件导入功能进行了全面改进,用5个点击导入我的大型文件,并且在没有我的干预下处理了编码/字段长度问题。

enter image description here


我导入了一个300万条记录的文件,但它没有标识列。我想添加一个标识列,你能告诉我怎么做吗? - haiduong87
这个有用吗?https://dev59.com/K3NA5IYBdhLWcg3wNrAy - Matt Evans

3

SQL管理工具的数据导入会查看前几行以确定源数据规格。

将记录移动,使最长的文本在顶部。


1
是的,在 Excel 的第一列添加最大长度字符,然后导入 Excel,它就可以工作了。 - yogesh lodha

1
我曾在两个不同的数据库(DB2和SQL)上遇到类似的问题,最终通过在来自DB2的源查询中使用CAST解决了它。我还利用了一个查询,将源列适应为varchar并避免了无用的空格:
CAST(RTRIM(LTRIM(COLUMN_NAME)) AS VARCHAR(60) CCSID UNICODE 
   FOR SBCS DATA)  COLUMN_NAME

这里的重要问题是CCSID转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接