【发布时间】: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