SSIS字符串截断错误

4
我有一个SQL Server 2005 SP2数据库,其中有一个名为“poc_resp_city”的属性,其长度为“nvarchar(35)”。
两个月前将其更改为“nvarchar(80)”,但数据仓库中的相同属性仍为“nvarchar(35)”。
经过两个月的正常工作后,SSIS数据加载包现在每次运行时都会返回包失败,并显示以下错误:
“输出列“poc_resp_city”(2250)在输出“OLE DB Source Output”(11)上出错。返回的列状态是:“文本被截断或一个或多个字符在目标代码页中没有匹配项。” SSIS错误代码DTS_E_PRIMEOUTPUTFAILED。组件“Source Table”(1)上的PrimeOutput方法返回了错误代码0xC020902A。当管道引擎调用PrimeOutput()时,该组件返回了一个失败代码。失败代码的含义由组件定义,但错误是致命的,管道停止执行。可能会有更多关于失败的信息发布在此之前。”
关于此问题,未对包或数据库进行任何修改。我知道我可以忽略此错误或做出安排以确保它正常工作,但我想提供一个适当和可接受的答案,解释为什么这个错误会在修改2个月后出现?因为也许我在这种情况下错过了重要的步骤。
重要提示:我甚至没有一条记录超过35个字符,因此永远不会发生截断。(这个警告属于某种SSIS验证步骤)
现在我认为,也许在一段时间后,SSIS包会重新编译自己,现在它看到其元数据中的这个不对齐(35 = / = 80),因为“TruncationRowDisposition”属性被设置为“RD_FailComponent”,所以它会失败该组件。
我将排除代码页选项,因为每个数据库列都是“nvarchar”,而不是“varchar”,所以这不应该是问题。
谢谢!

你有检查源表中的MAX(LEN())吗?我猜你可能选择了一个超过35个字符的记录,可能是不可打印字符或尾随空格。这似乎比自发重新编译的解释更有可能,虽然SSIS 2005相对较旧,并且总是比2008或2012具有更奇怪的行为。 - criticalfix
我已经检查过了,并且也检查了LEN(city+'a')以忽略空格。(因为LEN('aa')和LEN('aa ')返回相同的值。而且没有记录超过35) - dn7123
我真的认为你错了。这不是一个验证错误,而且它只是在一段时间后出现,强烈表明有人刚好输入了超过35个字符的数据量。如果你真的想找到问题的根源,请按照以下建议运行程序包并隔离导致问题的数据行(通过重现问题然后分而治之找到数据)。当你隔离出数据行时,一切都会变得清晰明了。 - Nick.McDermaid
如果你确信绝对没有任何修改,那么唯一的罪魁祸首就是数据库中的数据,因为最终用户可以修改它。 - Nick.McDermaid
1个回答

2
您需要刷新列的大小:
  1. 右键单击 OLE DB Source -> 显示高级编辑器
  2. 选择 输入和输出属性 选项卡 -> Ole DB Source Output -> Output Columns
  3. 在右侧面板中插入您的新大小的 Length 行。
  4. 点击 OK

Show Advanced Editor

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

请记住,在数据流中可能还有更多需要编辑列长度的元素,例如 Data Converion...


是的,我知道我可以通过使用高级编辑器并将数据长度设置为正确的长度来使其工作。 但从客户的角度来看,我必须给出一个正确的原因,解释为什么在2个月的不对齐后,在SSIS中会出现此错误。 - dn7123
1
你可以将查询数据分成两半,观察是否会出现错误。然后再将出错的部分一分为二,直到找到引发错误的那一行为止 :) - Justin
没有 SQL Server 错误。这个错误只会在 SSIS 的元数据验证任务中显示出来。 - dn7123
我猜你从未找出为什么错误只在两个月后发生? - Kendall Lister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接