SSIS:处理Excel文件时为何不同错误的传播行为不同?
用For Each Loop批量处理Excel文件,原本期望循环内不管出什么错,都能跳过当前文件继续处理下一个。配置逻辑是在Loop里直接放Sequence Container,里面塞多个控制流任务,给Container加了OnError事件处理错误日志,还把Propagate设为False、MaximumErrorCount设为0。
多数错误场景下这套配置能正常工作——比如DataConversion任务出现截断错误时,会终止当前文件处理、记好错误日志,然后继续处理下一个,整个包能成功跑完。但碰到任务验证错误(比如Excel文件缺列)时,错误就会往上窜,直接导致整个包失败,这时在For Each Loop级别会收到这条提示:
警告: SSIS警告代码DTS_W_MAXIMUMERRORCOUNTREACHED。执行方法成功,但引发的错误数(1)已达到允许的最大值(1);导致失败。当错误数达到MaximumErrorCount中指定的数量时会发生这种情况。请更改MaximumErrorCount或修复错误。
以下是解决这个问题的几个方法:
调大For Each Loop的MaximumErrorCount
默认For Each Loop的MaximumErrorCount是1,只要触发一次错误就会达到阈值让包失败。把这个数值改大,比如设成1000(远大于你要处理的文件总数),这样就算多个文件出验证错误,也不会因为触发最大错误数限制而终止整个包。给For Each Loop加OnError事件处理
验证错误可能绕过了Sequence Container的错误处理,直接触发了For Each Loop的错误事件。给Loop本身也加个OnError事件,同样把Propagate设为False,确保错误不会继续传到包级别,要是需要的话,也可以在这里补充记录错误日志。开启延迟验证(DelayValidation)
任务验证错误一般在包启动前的验证阶段就会触发,开启DelayValidation=True能把验证推迟到任务执行时再做,这样错误就能进入你配置的错误处理流程,而不是提前炸掉整个包。需要给Sequence Container和里面的数据流任务都开这个属性:- 选中Sequence Container,在属性窗口找到
DelayValidation,改成True - 选中里面的Data Flow Task,同样把
DelayValidation设为True
- 选中Sequence Container,在属性窗口找到
关闭Excel源的外部元数据验证
如果是数据流里的Excel源因为缺列触发的验证错误,可以试试把Excel源属性里的ValidateExternalMetadata设为False,关掉外部元数据验证,避免因为列缺失提前触发错误。不过这个设置要谨慎,可能会掩盖其他元数据问题,得结合实际情况用。
内容的提问来源于stack exchange,提问作者JamesB

