SSIS项目插入数据遇错误即中断,如何跳过错误继续写入?
解决方案:SSIS忽略插入错误并完成全量数据处理
1. 修正目标组件的错误输出配置
- 选中数据流中的目标表组件(如OLE DB目标),右键选择「编辑」,切换到「错误输出」选项卡
- 将
ErrorCode和ErrorColumn列的错误、截断处置方式全部设置为「忽略失败」(Ignore Failure) - 注意:必须针对目标组件配置,上游转换组件的错误配置不影响插入阶段的错误处理
2. 调整数据流任务的错误阈值
- 右键数据流任务 → 打开「属性」面板,修改
MaximumErrorCount为足够大的数值(如999999),避免少量错误就触发任务终止 - 同时将
FailPackageOnFailure和FailParentOnFailure设为False,确保单个数据流任务的错误不会中断整个包的执行
3. 错误行重定向(更可控的方案)
如果单纯忽略失败仍无效,改用错误行重定向模式:
- 在目标组件的「错误输出」中,将错误处置设置为「重定向行」(Redirect Row)
- 添加平面文件目标或专门的错误日志表,接收重定向的错误行,记录错误代码、描述及原始数据
- 这种方式既保证正常行完成插入,又能留存错误数据用于后续排查
4. 用T-SQL替代SSIS组件执行插入(终极方案)
若SSIS组件的错误逻辑始终不生效,直接用带错误处理的T-SQL语句:
- 单条插入用
TRY...CATCH包裹:
BEGIN TRY INSERT INTO 目标表 (列1, 列2) VALUES (@值1, @值2) END TRY BEGIN CATCH -- 可选:记录错误到日志表 INSERT INTO 错误日志表 (错误信息, 错误时间, 原始数据) VALUES (ERROR_MESSAGE(), GETDATE(), CONCAT('值1:', @值1, '; 值2:', @值2)) END CATCH
- 批量插入先判断主键是否存在,避免冲突:
INSERT INTO 目标表 (列1, 列2) SELECT 源列1, 源列2 FROM 源数据 WHERE NOT EXISTS ( SELECT 1 FROM 目标表 WHERE 主键列 = 源数据.主键列 )
这种方式完全由SQL控制错误逻辑,不受SSIS组件默认行为限制
5. 验证执行模式
- 避免在调试模式下使用「逐行执行」,该模式遇到错误会暂停而非继续
- 切换到正常执行模式,确认错误行被跳过、后续数据正常处理
内容的提问来源于stack exchange,提问作者Gastón Díaz
相关产品推荐
相关产品推荐

