SSIS文本被截断,状态值为4。

24

我正在开发一个SSIS包,试图从一个CSV格式的平面文件更新一个现有的SQL表。所有列都成功更新,除了一列。如果我在截断时忽略这一列,则我的包可以成功完成。所以我知道这是一个截断问题而不是错误。

几乎每一行的这一列都是空的。然而,有一些行其中这个字段是200-300个字符。我的数据转换任务将此字段标识为DT_WSTR,但从我在其他地方读到的信息来看,也许应该是DT_NTEXT。 我已经尝试过两种方式,甚至将DT_WSTR设置为500。 但这些都没有解决我的问题。我该如何解决?我SQL表中这一列应该使用什么数据类型?

Error: 0xC02020A1 at Data Flow Task 1, Source - Berkeley812_csv [1]: Data conversion failed. The data conversion for column "Reason for Delay in Transition" returned status value 4 and status text "Text was truncated or one or more characters had no match in the target code page.".
Error: 0xC020902A at Data Flow Task 1, Source - Berkeley812_csv [1]: The "output column "Reason for Delay in Transition" (110)" failed because truncation occurred, and the truncation row disposition on "output column "Reason for Delay in Transition" (110)" specifies failure on truncation. A truncation error occurred on the specified object of the specified component.
Error: 0xC0202092 at Data Flow Task 1, Source - Berkeley812_csv [1]: An error occurred while processing file "D:\ftproot\LocalUser\RyanDaulton\Documents\Berkeley Demographics\Berkeley812.csv" on data row 758.
11个回答

28
这个错误的一个可能原因是,你的分隔符(逗号、分号、管道等)实际上出现在某一列的数据中。这会导致非常误导性的错误信息,通常带有完全不同列的名称。
检查方法之一是将“坏”行重定向到一个单独的文件中,然后手动检查它们。以下是如何执行此操作的简要说明:

http://redmondmag.com/articles/2010/04/12/log-error-rows-ssis.aspx

如果这确实是您的问题,那么最好的解决方案是在源文件中修复引用数据值和/或使用不在数据中的不同分隔符。

谢谢,但我的经理刚刚告诉我我们不再需要这个表格/文件了! - salvationishere
如果您正在使用SSMS导出和导入数据,请确保告诉它使用引号标识符以消除此错误 - SliverNinja - MSFT

20

我之前遇到过这个问题,很可能是文件的默认列大小不正确。它会将默认大小设置为50个字符,但您正在处理的数据更大。在数据文件的高级设置中,将列大小从50调整为表格的列大小。


只是跟进一下,确保您将此更新设置在源上,而不仅仅是目标上。我也遇到了完全相同的错误,在读取期间出现错误,而没有输出到表格中。 - Vlookup

10

我怀疑这个错误的问题在于目标代码页中有一个或多个字符无法匹配。

如果删除该列中有值的行,它能够加载吗? 您能否确定导致包失败的行? 可能是数据太长了,也可能是在其中存在一些 SQL Server 不喜欢的奇怪字符。


1
Beth,就像我之前所说的,当我忽略了这一列的截断时,所有这些记录都被更新了。 - salvationishere
好的,所以你已经查看了行并没有发现任何异常。可能是长度的问题。你能否手动将一个失败的行数据复制到表格中?这样可能会给你一个更有意义的错误信息。 - Beth
我该如何将这些失败的行从Excel复制到SQL? - salvationishere
编写一个插入语句。目的是在SSIS之外使其正常工作。SQL可能会给您更好的消息,或者至少为测试隔离问题。 - Beth
对不起,贝丝;我知道如何为 SQL 数据编写插入语句,但不知道如何为 Excel 编写。我该怎么做? - salvationishere
你想把CSV文件中的数据放到SQL服务器,对吧?那么你要先找到导致问题的CSV文件行,然后不使用ssis插入,而是使用mgmt studio的SQL语句进行插入。 使用Excel打开CSV文件可以,但记事本也可以,除非太大了。 - Beth

6
如果这是来自SQL Server导入向导的信息,请尝试在数据源上编辑列的定义,默认情况下为50个字符,但可以更长。
数据源 ->高级->查看出错的列 ->将OutputColumnWidth更改为200,然后再试一次。

3
我以前遇到过这个问题,你可以进入“选择数据源”的“高级”选项卡,点击“建议类型”按钮,并将“行数”设置为所需的值。之后,类型和文本合格值将被设置为真实值。
我应用了上述解决方案并将我的数据转换为SQL。

2

在我的情况下,一些行的列数与标题不同。例如,标题有10列,而你的某一行只有8或9列。(列 = 每行中分隔符字符的计数)


0

如果所有其他选项都失败了,尝试重新创建数据导入任务和/或连接管理器。如果自任务最初创建以来您进行了任何更改,这有时可以解决问题。我知道这相当于重新启动,但是,嘿,如果有效,那就行。


0

我有同样的问题,而且是由于一列非常长的数据。 当我进行映射时,我将它从DT_STR更改为Text_Stream,然后它就可以工作了


0

在目标地方,提前检查列的长度是否与源相等。


0

必须增加列的OuputColumnWidth。 路径:源连接管理器-->高级-->OuputColumnWidth


欢迎来到Stackoverflow。这个问题已经被提出超过12年了,并且已经有一个被接受的答案。请在添加新答案时添加一些详细信息,说明你为什么要这样做。 - MD Zand

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