【问题标题】:SSIS string truncation errorSSIS 字符串截断错误
【发布时间】:2013-06-29 21:02:32
【问题描述】:

我有一个 SQL Server 2005 SP2 数据库,它有一个带有poc_resp_city 属性的表,即nvarchar(35)

在 2 个月前更改为 nvarchar(80),而没有对齐数据仓库中的相同属性。 (仍然有nvarchar(35)

SSIS 数据加载包(正常工作两个月后)现在每次运行时都会返回包失败,并出现以下错误:

输出列“poc_resp_city”(2250) 出现错误 “OLE DB 源输出”(11)。返回的列状态是:“文本是 截断或一个或多个字符在目标代码中不匹配 页。”。输出列“poc_resp_city”出现错误 (2250) 在输出“OLE DB 源输出”(11) 上。列状态 返回的是:“文本被截断或一个或多个字符没有 在目标代码页中匹配。”。

SSIS 错误代码 DTS_E_PRIMEOUTPUTFAILED。 PrimeOutput 方法 组件“源表”(1) 返回错误代码 0xC020902A。这 管道引擎调用时组件返回失败代码 素数输出()。故障代码的含义由 组件,但错误是致命的并且管道停止执行。 在此之前可能会发布带有更多信息的错误消息 关于失败。

软件包和数据库均未针对此问题进行修改。我知道我可以忽略这个错误,或者我可以做出安排以确保它正常工作,但我想提供一个正确且可接受的答案,为什么这个错误会在修改后 2 个月出现?因为也许我错过了在这种情况下的重要一步。

重要提示:我什至没有一条超过 35 个字符的记录,因此不会发生截断。 (此警告属于某种 SSIS 验证步骤)

现在我认为,也许在一段时间后,SSIS 包会重新编译自己,现在它在其元数据中看到了这种错位 (35 =/= 80),并且因为 TruncationRowDisposition 属性设置为 RD_FailComponent,它失败了组件。

我会排除代码页选项,因为每个数据库列都是nvarchar,而不是varchar,所以不应该是这种情况。

谢谢!

【问题讨论】:

  • 你检查了源表中的 MAX(LEN()) 吗?我猜你以某种方式选择了超过 35 个字符的记录,可能是不可打印的或尾随空格。这似乎比自发的重新编译解释更有可能,尽管 SSIS 2005 相当陈旧并且总是比 2008 或 2012 有更奇怪的行为。
  • 我检查了它并检查了 LEN(city+'a') 以忽略空格。 (因为 LEN('aa') 和 LEN('aa') 返回相同的值。并且没有记录超过 35
  • 我真的认为你错了。这不是验证错误,它只是在一段时间后出现的事实强烈表明有人恰好输入了超过 35 的数据量。如果您真的想深入了解它,请按照建议在下面运行包并隔离导致问题的数据行(通过重现问题然后分而治之来查找数据)。当您隔离数据行时,一切都会变得清晰。
  • 如果您确信没有任何东西可以被修改,那么 only 将数据库中的数据作为罪魁祸首,因为最终用户可以修改它。

标签: sql-server-2005 ssis truncation


【解决方案1】:

您需要刷新列的大小:

  1. 用右键按下OLE DB Source -> Show Advanced Editor
  2. 选择Input and Output Properties 标签 -> Ole DB Source Output -> Output Columns
  3. 在右侧面板Length 行中插入您的新尺寸。
  4. 推送OK

或者您可以从OLE DB Source 复制您的查询,删除OLE DB Source,插入新的OLE DB Source 并粘贴查询。这会自动刷新您的列。

请记住 Dataflow 中可能还有哪些元素需要编辑列的长度,例如 Data Converion...

【讨论】:

  • 是的,我知道我可以通过使用高级编辑器并将数据长度设置为正确的来完成这项工作。但是从客户的角度来看,我必须给出一个正确的原因,为什么这个错误会在 2 个月的错位后出现在 SSIS 中。
  • 您可以将查询数据分成两半并观察是否出现错误。然后在错误一半的地方再次拆分,直到找到引发错误的一行:)
  • 没有 SQL Server 错误。此错误仅由 SSIS 的元数据验证任务显示。
  • 我猜你从来没有发现为什么两个月后才出现错误?
最近更新 更多