SSIS包ODBC连接仅在循环执行时失败问题求助
我们正将服务器从SQL Server 2016迁移至SQL Server 2019,同步升级目录中所有SSIS包。迁移向导无报错,VS本地测试运行正常,但部署到SSIS目录后执行出现以下错误:
Error: 0xC0014020 at Load ODI_PaymentDevice, ODBC Source [14]: SQLSTATE: HY010, Message: [Microsoft][ODBC Driver Manager] Function sequence error;
Error: 0xC0209029 at Load ODI_PaymentDevice, ODBC Source [14]: 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. An error occurred on the specified object of the specified component. There may be error messages posted before this with more information about the failure.
Error: 0xC0047038 at Load ODI_PaymentDevice, SSIS.Pipeline: SSIS Error Code DTS_E_PRIMEOUTPUTFAILED. The PrimeOutput method on ODBC Source returned error code 0xC0209029. The component returned a failure code when the pipeline engine called PrimeOutput(). The meaning of the failure code is defined by the component, but the error is fatal and the pipeline stopped executing. There may be error messages posted before this with more information about the failure.
触发条件
- 仅出现在通过SSIS ODBC连接器连接Hive、数据流使用ODBC数据源的包中
- 包包含
For Each Loop Container(按日期循环加载数据)时,第二次循环100%失败 - VS本地测试仅处理单个日期故正常;部署后仅加载单日期时可正常运行,排除部署/参数问题
已尝试的无效方案
- 删除并重建ODBC数据源
- 以32位模式运行包
- 更新Microsoft Hive ODBC驱动至最新版本
- 更换为CDATA ODBC驱动
- 改用ADO.NET连接替代ODBC
- 调整驱动的各类配置组合
- 传递NULL值排查元数据不匹配问题
进一步排查发现
开启Hive ODBC驱动LOG_TRACE后,观察到第二次循环的查询已发送至TEZ执行引擎,但很快被取消,SSIS主动断开了连接。
1. ODBC连接池与循环复用冲突
SQL Server 2019的SSIS运行时对ODBC连接池的处理逻辑可能与2016不同。For Each Loop中重复使用同一ODBC连接时,连接池可能未正确重置会话状态,导致第二次循环时驱动执行函数的顺序不符合ODBC规范(对应错误HY010 Function sequence error)。
- 尝试在每次循环结束后显式关闭并重新创建ODBC连接:在For Each Loop内部添加“执行SQL任务”执行
DISCONNECT语句,或在连接管理器中禁用连接池(修改连接字符串添加Pooling=False)。
2. SSIS 2019的数据流引擎行为变更
SSIS 2019对数据流组件的生命周期管理做了优化,可能导致ODBC Source组件在循环中未正确释放资源。第二次循环时,组件残留的前一次会话状态干扰了新查询的执行。
- 尝试将ODBC Source所在的数据流任务封装为子包,在For Each Loop中调用子包而非复用同一数据流任务,强制每次循环初始化全新的组件实例。
3. Hive TEZ引擎的会话超时/资源释放延迟
虽然查询已发送至TEZ,但SSIS可能因等待响应超时主动断开连接,或TEZ引擎未及时释放前一次查询的会话资源,导致新查询无法正常建立会话。
- 调整Hive ODBC驱动的超时参数(如
QueryTimeout、LoginTimeout),延长等待时间;同时检查Hive集群的TEZ任务超时配置,确保足够的资源回收时间。
4. SSIS参数传递的隐式类型转换问题
循环中传递日期参数时,SSIS 2019对参数的类型处理可能与2016不同,导致第二次循环时参数传递异常,触发ODBC函数顺序错误。
- 显式指定参数的数据类型(确保与Hive表字段类型完全匹配),或在查询中直接拼接日期字符串(需注意SQL注入风险,仅在可控场景下使用),替代参数化查询。
内容的提问来源于stack exchange,提问作者Mategas

