如何防止SSIS截断平面文件中最后一行的最后一个字段?

7
我有一个SSIS包,可以解压并加载文本文件。它从调试器中运行良好,并且从各种服务器上载到我们的生产环境时也非常好用。但是,现在我遇到了问题:正在加载一个文件,一切都很正常,但突然,在最后一个数据行(根据错误消息)的最后一个字段被截断了。我认为我们收到的文件可能出了问题,打开检查后发现没有问题。这是一个以|分隔的文件,没有文本限定符,以{CR}{LF}作为行分隔符。由于截断错误的字段是行中的最后一个字段(在本例中是整个文件的最后一个字段),因此它的分隔符是{CR}{LF}而不是|
该文件看起来完好无损,甚至可以完美地加载到Excel中,没有任何问题。我已经通过在VS 2008中使用调试器来运行本地机器上的包处理了该文件,它完美地运行。有人遇到过如此类似的行为问题吗?我无法在崩溃的环境中进行太多测试,因为这是我们的生产环境,而且这是高峰时段...所以非常感谢任何建议。
错误消息如下: 描述: 数据转换失败。列“ACD_Flag”的数据转换返回了状态值4和状态文本“文本被截断或一个或多个字符在目标代码页中没有匹配项”。结束错误 错误: 2013-02-01 01:32:06.32 代码: 0xC020902A 来源: Load ACD file into Table HDS Flat File 1 [9] 描述: “输出列“ACD_Flag”(1040)”失败,因为发生了截断,并且“输出列“ACD_Flag”(1040)”上的截断行处置指定了截断失败。在指定组件的指定对象上发生了截断错误。 结束错误 错误: 2013-02-01 01:32:06.32 ���码: 0xC0202092 来源: Load ACD file into Table [9] 描述: 在数据行737541上处理文件“MY FLAT FILE”时发生错误。 文件中的737541是最后一行。更新:最初我使用的行分隔符为{CR},但现已更新为{CR}{LF},以尝试解决此问题...虽然无济于事。

如果您在非生产环境中使用生产zip文件运行包,是否会产生相同的结果(错误)?如果您解压缩文件并检查它,除了最后一行外,所有行是否仍然是CRLF或者是实心的? - billinkc
是的,最后一行是一个叫做ACD_Flag的列,要么是A、C或者D。它在最后一行看起来很完美,并且带有{CR}和{LF},最后一行是完全空白的。 - misterManager
在问题中添加了错误信息。它绝对是在那一行。 - misterManager
看,这就是它的奇怪之处...数据完全正常,并且在其他环境中处理得非常顺利。我真的很想知道是否有已知的错误,是否曾经发生过这种情况。不过,你的例子很棒。 - misterManager
如果有人对常见的平面文件代码页不匹配有任何想法,或者对类似(无法复制)错误有任何经验以及如何解决它,那将不胜感激。非常感谢@Siva提供了极其详细的答案,即使它们并不完全是我所寻找的。 - misterManager
7个回答

10

更新:

我能够重现您在问题中添加的错误信息。当您在行中拥有比平面文件连接管理器中定义的列分隔符更多时,就会发生错误。

以下是一个简单的示例来说明它。我创建了一个如下所示的简单文件。

Sample file

我创建了一个包,并使用下面显示的设置配置了平面文件连接管理器。

Flat file General

Flat file Column 0

Flat file Column 1

Flat file Advanced

Flat file Preview

我使用数据流任务配置了该软件包,以读取文件并将数据填充到数据库表中。但是当我执行该软件包时,它失败了。

Failed

在BIDS上点击执行结果选项卡。它会显示与您在问题中发布的相同消息。

[Flat File Source [44]] Error: Data conversion failed. The data conversion for column "Column 1" returned status value 4 and status text "Text was truncated or one or more characters had no match in the target code page.".
[Flat File Source [44]] Error: The "output column "Column 1" (128)" failed because truncation occurred, and the truncation row disposition on "output column "Column 1" (128)" specifies failure on truncation. A truncation error occurred on the specified object of the specified component.
[Flat File Source [44]] Error: An error occurred while processing file "C:\temp\FlatFile.txt" on data row 2.
[SSIS.Pipeline] Error: SSIS Error Code DTS_E_PRIMEOUTPUTFAILED.  The PrimeOutput method on component "Flat File Source" (44) returned error code 0xC0202092.  The component returned a failure code when the pipeline engine called PrimeOutput(). The meaning of the failure code is defined by the component, but the error is fatal and the pipeline stopped executing.  There may be error messages posted before this with more information about the failure.

希望这能帮助您识别问题。

Execution results

之前的回答:

我认为您文件中最后一行的最后一个字段的值可能超过了Flat File Connection Manager上最后一列的OutputColumnWidth属性的值。

在SSIS包上右键单击Flat File Connection Manager。在Flat File Connection Manager Editor上点击Advanced选项卡页面。点击最后一列并检查OutputColumnWidth属性上的值。

现在,请验证导致您的包失败的文件中最后一行的最后一个字段的数据长度。

OutputColumnWidth

如果这是问题的原因,以下是两种可能的解决方案:

  1. 将最后一列的OutputColumnWidth属性增加到适当的长度,以满足您的要求。

  2. 如果您不关心截断警告,可以更改平面文件源编辑器中最后一列的截断错误输出。双击Flat File Source Editor,单击Error Output。将截断列值更改为忽略失败重定向行。我更喜欢Redirect row,因为它可以通过将无效数据重定向到单独的表格来跟踪传入文件中的数据问题,并采取必要的措施来修复数据。

希望这能给您解决问题的思路。

Error output


2
尽管这并没有解决我的问题,但我还是点了个赞,因为这是一个非常有帮助和详细的答案,可能会帮助到很多遇到这个问题的人。 - misterManager

5
所以我想出了一个答案。其他答案都非常深思熟虑和优秀,但是我使用了稍微不同的技术来解决这个问题。
我几乎排除了截断的可能性,因为一旦我查看了平面文件中的数据,它就没有意义...截断绝对不会发生。因此,我决定将注意力集中在错误消息的后半部分:或一个或多个字符在目标代码页中没有匹配项 经过一些强烈的谷歌搜索,我发现了一些类似于这个网站的网站: http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/6d4eb033-2c45-47e4-9e29-f20214122dd3/ 基本上,如果您知道截断不会发生,那么您就有了没有代码页匹配的字符,因此从1252 ANSI Latin I 切换到65001 UTF-8应该会有所不同。
由于这已经移动到生产环境,并且生产环境是唯一出现此问题的环境,因此我想确保我有正确的修复方法,因此我进行了一次更改。我没有文本限定符,但是SSIS仍将Flat File Connection Manager中每个列的默认Text_Qualified属性设置为TRUE。我将所有这些属性都设置为false(不仅仅是问题列)。所以现在包不会看到它需要限定符,然后去查找限定符并查看<none>,然后不再寻找限定符...它只是根本不使用限定符。
通过这两个更改,软件包终于成功运行。由于这两个更改都在同一个版本中完成,并且我只在生产中收到了此错误,并且我无法承担来回切换不同的东西进行实验目的,因此我不能确定哪个更改最终做到了这一点,但我可以告诉您这些是我所做的唯一两个更改。
需要注意的一件事是:运行此软件包的生产机器是:10.50.1617,而我正在开发的机器(以及我正在测试的大多数机器)是:10.50.4000。我已经将这提升为我们Ops DBA的可能问题,并希望我们能够使一切保持一致。
希望这能帮助任何遇到类似问题的人。如果任何人需要额外的信息或细节(我觉得我已经涵盖了所有内容),请在此处发表评论并让我知道。我将非常乐意更新此内容,以使其对未来的任何人更有帮助。

这是一个很棒的解决方案。但我不认为文本限定符与此有关。我只是改变了我的代码页,然后它就奏效了。 - Pow-Ian
这个答案很棒!在我改成Unicode并确保所有的Text_Qualified为False之后,我还需要更改<b>destination</b>属性:将DefaultCodePage更改为65001,并将AlwaysUseDefaultCodePage设置为True。 - Cherry Wu

2

这只发生在一个服务器上吗?您没有使用测试限定符吗?我们之前也遇到过这种情况。以下是解决方法:

进入该服务器并打开xml文件。搜索TextQualifier并查看其是否为:

 <DTS:Property DTS:Name="TextQualifier" xml:space="preserve">&lt;none&gt;</DTS:Property>

如果它没有做到这一点,请让它说出来。

1
你非常接近正确答案了!我终于找到了它!我进行了两个更改,其中任何一个都可能是将其整理好的那个。 (1) 由于文本限定符已经设置为<none>,因此我决定在连接管理器中标记每个字段属性为Text_Qualifier = FALSE。(2) 在一篇类似问题的博客文章的建议下,我将代码页从“1252 ANSI Latin I”更改为“65001 UTF-8”。这两个更改中的一个或两个的组合纠正了所有问题。 - misterManager
此外,运行此服务器的生产环境为10.50.1617,但我的计算机和测试的机器是10.50.4000... 这也可能是一些问题的原因。 - misterManager

1

我遇到了完全相同的错误。我的源文本文件包含Unicode字符,我通过使用Unicode编码(而不是默认的UTF-8编码)保存文本文件,并在数据源对话框中勾选Unicode复选框来解决了这个问题。


1

只需按照以下简单步骤操作:

1. 右键单击OLE DB源或目标对象,然后单击“显示高级编辑器...”。 2. 在高级编辑器屏幕上,单击组件属性页面。 3. 将AlwaysUseDefaultCodePage设置为True。 4. 单击确定。 5. 单击确定保存用于SSIS包中当前OLE DB源或目标对象的设置。


0
我知道这已经是一年后的事情了,但当我打开平面文件连接管理器时,对于文本限定符,它显示为"_x003C_none_x003E_"。我将 "_x003C_none_x003E_" 的十六进制码垃圾替换为箭头,像应该是的那样,"<" none ">"(编辑器正在删除箭头),然后它就停止丢失文件的最后一行。

这是一个在特定更新后出现在2008 R2上的问题。如果你的工作场所中有一些机器版本过旧,而另一些机器版本较新,那么你会经常遇到这个问题。目前我找不到更多的信息。这并不是我在这里遇到的问题。 - misterManager

0

以下步骤可能会帮助您解决问题。

  1. 通过右键单击源代码,进入高级编辑器。
  2. 点击组件属性。
  3. 将AlwaysUseDefaultCodePage设置为TRUE。
  4. 保存更改。

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