如何让SSIS包执行SQL脚本时跳过错误继续执行?
解决SSIS Execute SQL Task遇错后继续执行的问题
核心原因
你设置的MaximumErrorsCount不生效,是因为Execute SQL Task会把整个SQL脚本作为一个单一批处理提交给SQL Server执行。默认情况下,SQL引擎在批处理中遇到第一个错误时就会终止整个批的执行,SSIS根本没机会触发后续的错误计数,所以这个参数起不到作用。
可行解决方案
1. 用TRY-CATCH包裹SQL语句(推荐)
直接修改SQL脚本,把每条可能出错的语句(或逻辑相关的语句组)用TRY-CATCH块包裹,这样单条语句出错时会被捕获,不会中断整个脚本的执行,还能记录错误信息便于排查。
示例改造后的SQL脚本:
-- 可选:先创建错误日志表(如果需要记录错误) -- CREATE TABLE ErrorLog (ErrorID INT IDENTITY(1,1) PRIMARY KEY, ErrorMessage NVARCHAR(MAX), ErrorTime DATETIME DEFAULT GETDATE()); BEGIN TRY INSERT INTO YourTable VALUES ('正常数据1'); END TRY BEGIN CATCH -- 记录错误到日志表 INSERT INTO ErrorLog (ErrorMessage) VALUES (ERROR_MESSAGE()); END CATCH BEGIN TRY INSERT INTO YourTable VALUES ('错误数据'); -- 这条执行失败 END TRY BEGIN CATCH INSERT INTO ErrorLog (ErrorMessage) VALUES (ERROR_MESSAGE()); END CATCH BEGIN TRY INSERT INTO YourTable VALUES ('正常数据2'); -- 这条会继续执行 END TRY BEGIN CATCH INSERT INTO ErrorLog (ErrorMessage) VALUES (ERROR_MESSAGE()); END CATCH
2. 拆分SQL任务
把原有的大SQL脚本拆分成多个小脚本,每个脚本包含少量语句,然后在SSIS中添加多个Execute SQL Task分别执行这些小脚本。
给每个Execute SQL Task配置错误处理程序:
- 右键任务 → 选择「编辑事件处理程序」
- 选择
On Error事件,设置事件处理的「Fail Parent Constraint」为False,这样单个任务出错时,整个包会继续执行后续的SQL任务。
这个方法适合语句可以按逻辑分组的场景,但如果有2000条语句,设置起来会比较繁琐。
3. 调整SQL执行环境参数
在脚本开头添加SET XACT_ABORT OFF,确保SQL Server在遇到非致命错误时不会终止整个批处理。不过这个参数主要影响事务内的行为,建议结合TRY-CATCH一起使用,效果更稳定。
注意事项
- 如果你的脚本包含事务操作,要注意
TRY-CATCH对事务状态的影响,必要时在CATCH块中判断事务状态并做回滚或提交处理。 - 记录错误日志是很有必要的,否则你无法知道哪些语句执行失败,不利于后续排查问题。
内容的提问来源于stack exchange,提问作者Sanket Tarun Shah
相关产品推荐
相关产品推荐

