6

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

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

它是一个|分隔文件,没有文本限定符,并且{CR}{LF}作为行分隔符。由于截断错误的字段是行中的最后一个字段(在这种情况下是整个文件的最后一个字段),因此它的分隔符{CR}{LF}|.

该文件看起来很原始,我什至将它加载到 Excel 中,没有任何问题,也没有任何投诉。我已经通过我的本地机器运行了这个文件,通过 VS 2008 中的调试器运行包,它运行得很好。有没有人对这样的行为有任何问题?我无法在它崩溃的环境中对其进行太多测试,因为它是我们的生产环境,而且现在是高峰时间......所以非常感谢任何建议。

错误信息:

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}以尝试解决这个问题......虽然无济于事。

4

7 回答 7

10

更新:

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

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

示例文件

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

平面文件一般

平面文件第 0 列

平面文件第 1 列

平面文件高级

平面文件预览

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

失败的

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

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

希望它有助于确定您的问题。

执行结果

上一个答案:

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

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

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

输出列宽

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

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

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

希望能给你一个解决问题的想法。

错误输出

于 2013-02-01T19:31:45.680 回答
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 Ito切换65001 UTF-8应该会有所作为。

由于这已移至生产环境,并且生产环境是唯一存在此问题的环境,我想 100% 确定我有正确的修复,所以我又做了一个更改。我没有文本限定符,但 SSIS 仍将Text_Qualified平面文件连接管理器中每一列的默认属性保留为TRUE. 我将它们全部设置为 false(不仅仅是有问题的列)。所以现在这个包没有看到它需要一个限定符,然后去限定符看看<none>,然后不寻找一个限定符......它只是完全不使用限定符期间。

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

需要注意的一点:运行此软件包的生产机器是:10.50.1617我正在开发的机器(以及我正在测试的大多数机器)是:10.50.4000. 我已经向我们的 Ops DBA 提出了这个可能的问题,希望我们能让一切保持一致。

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

于 2013-02-06T16:34:10.777 回答
2

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

转到该服务器并打开 xml 文件。搜索TextQualifier,看看它是否说:

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

如果它不让它这么说。

于 2013-02-05T21:35:00.173 回答
1

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

于 2015-10-21T13:54:31.617 回答
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.

于 2019-02-24T03:49:04.053 回答
0

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

于 2014-01-22T17:49:31.293 回答
0

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

  1. 右键单击 Source 以显示高级编辑器。2.单击组件属性。
  2. 并将 AlwaysUseDefaultCodePage 设置为 TRUE。
  3. 并保存他的更改。
于 2020-10-14T10:29:31.323 回答