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

问题描述 投票:5回答:6

我有一个解压缩并加载文本文件的SSIS包。它从调试器以及上传到生产环境的各种服务器上运行良好。

我现在的问题是:正在加载一个文件,一切都很好,但突然之间,在最后一个数据行(根据错误消息),最后一个字段被截断。我假设我们收到的文件可能搞砸了,打开它,一切都很好....

它是一个|分隔文件,没有文本限定符,{CR}{LF}作为行分隔符。由于具有截断错误的字段是行中的最后一个字段(在本例中是整个文件的最后一个字段),因此其分隔符为{CR}{LF}而不是|

该文件看起来质朴,我甚至将它加载到Excel中没有任何问题,也没有抱怨。我已经通过VS 2008中的deugger运行包的本地机器运行了这个文件,它运行得很好。有没有人对这样的行为有任何问题?我无法在它崩溃的环境中测试它,因为它是我们的生产环境,而且这些都是高峰时段....所以任何建议都非常感激。

Error message:

Description: Data conversion failed. The data conversion for column "ACD_Flag" returned status value 4 and status text "Text was truncated or one or more characters had no match in the target code page.". End Error Error: 2013-02-01 01:32:06.32 Code: 0xC020902A Source: Load ACD file into Table HDS Flat File 1 [9] Description: The "output column "ACD_Flag" (1040)" failed because truncation occurred, and the truncation row disposition on "output column "ACD_Flag" (1040)" specifies failure on truncation. A truncation error occurred on the specified object of the specified component. End Error Error: 2013-02-01 01:32:06.32 Code: 0xC0202092 Source: Load ACD file into Table [9] Description: An error occurred while processing file "MY FLAT FILE" on data row 737541.

737541是文件中的最后一行。

更新:最初我有行分隔符{CR},但我已更新到{CR}{LF}尝试修复此问题...虽然无济于事。

sql-server ssis sql-server-2008-r2 flat-file
6个回答
8
投票

Update:

我能够重新创建您添加到问题中的错误消息。如果行中的列分隔符多于您在平面文件连接管理器中定义的列分隔符,则会发生错误。

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

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

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

单击BIDS上的Execution Results选项卡。它显示您在问题中发布的相同消息。

[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.

希望有助于识别您的问题。

Previous answer:

我认为文件最后一行的最后一个字段中的值可能超过了平面文件连接管理器上最后一列的OutputColumnWidth属性值。

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

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

如果这是问题的原因,这里有两个可能的选项来解决这个问题:

  1. 将最后一列的OutputColumnWidth属性增加到适合您要求的长度。
  2. 如果您不关心截断警告,则可以更改平面文件源编辑器的最后一列上的截断错误输出。双击Flat File Source Editor,单击Error Output。将截断列值更改为Ignore failureRedirect row。我更喜欢Redirect row,因为它通过将无效重定向到单独的表并采取必要的操作来修复数据,从而能够跟踪传入文件中的数据问题。

希望能帮助您解决问题。


5
投票

所以我想出了一个答案。其他答案都经过深思熟虑和良好的解决,但我使用略有不同的技术解决了这个问题。

我几乎消除了截断的实际可能性,因为一旦我查看平面文件中的数据,它就没有意义......绝对不会发生截断。所以我决定关注错误信息的后半部分:or one or more characters had no match in the target code page

经过一些激烈的谷歌搜索后,我发现了一些像这样的网站:qazxsw poi

基本上这个想法是,如果你知道截断没有发生,你有没有代码页匹配的字符,所以从http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/6d4eb033-2c45-47e4-9e29-f20214122dd3/1252 ANSI Latin I的转换应该有所不同。

由于这已经转移到生产,并且生产环境是唯一有这个问题的环境,我想100%确定我有正确的修复,所以我做了一个更改。我没有文本限定符,但SSIS仍然将平面文件连接管理器中每列的默认65001 UTF-8属性保留为Text_Qualified。我将所有这些设置为false(不仅仅是相关列)。所以现在包看不到它需要一个限定符,然后转到限定符并查看TRUE然后不寻找限定符...它只是平坦不使用限定符期间。

在这两个更改之间,包最终成功运行。由于这两个更改都是在同一个版本中完成的,而且我只是在生产中收到了这个错误,而且我不能为实验目的来回切换不同的东西,我不能说最后做了哪个更改,但是我可以告诉你,这是我做的唯一两个变化。

有一点需要注意:运行此软件包的生产机器是:<none>和我正在开发的机器(我正在测试的大多数机器)是:10.50.1617。我已将此作为我们的Ops DBA的可能问题而提出,并希望我们能够使所有内容保持一致。

希望这将有助于其他有类似问题的人。如果有人想要更多的信息或细节(我觉得我已经涵盖了所有内容),请在这里发表评论告诉我。我很乐意对此进行更新,以使其对将来出现的任何人都更有帮助。


2
投票

它只发生在一台服务器上?你没有使用测试限定符?我们之前已经发生过这种情况。这就是修复它的原因。

转到该服务器并打开xml文件。搜索TextQualifier并查看是否显示:

10.50.4000

如果没有说出来的话。


1
投票

只需按照这些简单的步骤。

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


0
投票

我知道这是一整年后,但是当我打开平面文件连接管理器时,对于文本限定符,它有“_x003C_none_x003E_”。我替换了“_x003C_none_x003E_”十六进制代码垃圾并放置了它应该是的箭头,“<”无“>”(编辑器正在删除箭头),它停止丢弃文件的最后一行。


0
投票

我有完全相同的错误。我的源文本文件包含unicode字符,我通过使用unicode编码(而不是默认的utf-8编码)保存文本文件并检查数据源对话框中的Unicode复选框来解决它。

© www.soinside.com 2019 - 2024. All rights reserved.