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

时间:2013-02-01 18:45:08

标签: sql-server ssis sql-server-2008-r2 flat-file

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

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

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

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

错误消息:

|

737541 是文件中的最后一行。

更新:最初我有行分隔符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.,但我已将其更新为{CR}以尝试解决此问题...虽然无济于事。 < / p>

7 个答案:

答案 0 :(得分:8)

更新

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

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

Sample file

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

Flat file General

Flat file Column 0

Flat file Column 1

Flat file Advanced

Flat file Preview

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

Failed

单击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.

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

Execution results

上一个答案:

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

右键单击SSIS包上的平面文件连接管理器。点击Advanced上的 Flat File Connection Manager Editor 标签页。单击最后一列并检查OutputColumnWidth属性上的值。

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

OutputColumnWidth

如果这是导致问题的原因,可以通过以下两种方法解决此问题:

  1. 将最后一列的OutputColumnWidth属性增加到符合您要求的合适长度。

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

  3. 希望能帮助您解决问题。

    Error output

答案 1 :(得分:5)

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

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

经过一番激烈的谷歌搜索后,我发现了一些像这样的网站:http://social.msdn.microsoft.com/Forums/en-US/sqlintegrationservices/thread/6d4eb033-2c45-47e4-9e29-f20214122dd3/

基本上这个想法是,如果你知道截断没有发生,你就会有没有代码页匹配的字符,所以从1252 ANSI Latin I65001 UTF-8的转换应该有所不同。

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

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

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

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

答案 2 :(得分:2)

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

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

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

如果没有说出来的话。

答案 3 :(得分:1)

只需执行以下简单步骤即可。

1. Right-click the OLE DB source or destination object, and then click Show Advanced Editor…. 2. On the Advanced Editor screen, click the Component Properties page. 3. Set AlwaysUseDefaultCodePage to True. 4.Click OK. 5.Clicking OK saves the settings for use with the current OLE DB source or destination object within the SSIS package.

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

  1. 右键单击“源”以显示高级编辑器。 2.单击“组件属性”。
  2. 然后将AlwaysUseDefaultCodePage设置为TRUE。
  3. 并保存他的更改。