升级SQL Server 2019后SSIS项目ODBC函数序列错误致循环执行失败求助
问题背景
我们正将SQL Server从2012升级至2019,升级后某SSIS项目出现执行失败问题,此前该项目运行完全正常。项目中的核心SSIS包包含一个数据流任务,负责从MySQL数据库加载数据并插入到Microsoft SQL Server,这个数据流任务被放在For循环内,每次循环加载100万行数据。
故障现象
首次循环执行成功,数据已正确插入目标库,但第二次循环执行直接失败,报错信息如下:
Error: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR. The "ODBC Source.Outputs[ODBC Source Output]" failed because error code 0xC020F450 occurred, and the error row disposition on "ODBC Source" specifies failure on error.
SQLSTATE: HY010, Message: [Microsoft][ODBC Driver Manager] Function sequence error;
额外排查信息:
- 第二次循环使用的SQL语句直接在数据库执行能得到正确结果,但SSIS的ODBC源在第二次循环输出的所有列值均为空
- 将批量大小从100万行改为1000行后,第二次循环仍报相同错误
- 单独执行此前失败的第二次循环对应的数据范围可成功运行,但后续的第二次循环依旧失败,因此排除源数据类型不匹配问题
已尝试无效方案
- 将MySQL ODBC驱动降级至SQL Server 2012使用的版本
- 重新创建SSIS项目中的ODBC连接管理器
- 重新创建数据流任务
- 安装VS 2019中最新版本的SQL Server Integration Services Projects
可行解决方案尝试
方案1:重置ODBC连接状态
在For循环内,每次执行数据流任务前,先执行一个执行SQL任务,执行SET NOCOUNT ON;(或任意无返回结果的简单SQL语句),强制重置ODBC连接的状态,避免连接在循环中保持错误的状态序列。
方案2:修改ODBC连接管理器属性
- 打开ODBC连接管理器的属性窗口
- 找到
RetainSameConnection属性,将其值从True改为False- 该属性控制是否在整个包执行期间保持同一个连接,改为False后每次循环会重新建立连接,规避连接状态异常问题
方案3:替换为ADO.NET源
如果上述方案无效,尝试将数据流中的ODBC源替换为MySQL的ADO.NET源,通过MySQL官方ADO.NET驱动连接,绕过ODBC驱动管理器的函数序列错误。
方案4:调整数据流事务设置
- 打开数据流任务的属性窗口
- 将
TransactionOption属性设置为Supported或NotSupported,避免事务在循环中引发的连接状态冲突
内容的提问来源于stack exchange,提问作者Samay

