SSIS中ODBC源Execute SQL Task执行报错求助
我的SSIS配置情况
我在SSIS中创建了一个SQL源类型为变量的Execute SQL Task,定义了以下变量:
startTime:提供当前时间endTime:提供结束时间startTimeFormat:用于将日期格式化为解析记录所需的格式,表达式为:
startTimeFormat = (DT_WSTR, 4)DATEPART( "yyyy", @[User::startTime]) +"-" + RIGHT( "0" + (DT_WSTR, 2) MONTH(@[User::startTime]), 2) +"-" + RIGHT( "0" + (DT_WSTR, 2) DAY(@[User::startTime]), 2) +" " + (DT_WSTR, 2)DATEPART( "Hh", @[User::startTime] ) + ":" + (DT_WSTR, 2)DATEPART( "mi", @[User::startTime] ) + ":" + (DT_WSTR, 2)DATEPART( "ss", @[User::startTime] )
endTimeFormat:用于将日期格式化为解析记录所需的格式,表达式为:
endTimeFormat: (DT_WSTR, 4)DATEPART( "yyyy", @[User::endTime] ) +"-" + RIGHT( "0" + (DT_WSTR, 2) MONTH( @[User::endTime] ), 2) +"-" + RIGHT( "0" + (DT_WSTR, 2) DAY(@[User::endTime] ), 2) +" " + (DT_WSTR, 2)DATEPART( "Hh", @[User::endTime]) + ":" + (DT_WSTR, 2)DATEPART( "mi", @[User::endTime]) + ":" + (DT_WSTR, 2)DATEPART( "ss", @[User::endTime])
callProcedureQuery:用于构建存储过程调用语句,供Execute SQL Task使用,语句为:
"call sp_ccdr ('"+ @[User::startTimeFormat] + "', " + "'" + @[User::endTimeFormat] + "', '0',null,null,null,null,null,null,null,null,null,'NULL','NULL','f'"+ ")"
在Execute SQL Task中,我设置返回完整结果集,并创建了类型为object的变量varExecTaskRslt,将结果名称0映射到该变量。
当前变量解析正常,但执行Execute SQL Task时出现报错:
[Execute SQL Task] Error: Executing the query "call sp_ccdr ('2018-05-13 14:47:30', '2018-05-13 1..." failed with the following error: "Disconnected recordsets are not available from ODBC connections.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.
报错原因排查与解决方案
这个报错的核心原因是ODBC连接不支持SSIS中"完整结果集"(Full Result Set)的返回方式,ODBC驱动在处理这种结果集时有局限性,无法返回断开连接的记录集。下面是具体的排查和解决步骤:
1. 确认连接类型的限制
SSIS的Execute SQL Task在使用ODBC连接时,对于返回结果集的支持有限:
- 如果你选择"完整结果集",ODBC驱动无法将结果集以断开连接的方式返回给SSIS变量(这是ODBC驱动的固有局限)。
- 相比之下,OLE DB连接通常没有这个限制,能完美适配你当前的变量映射逻辑。
2. 解决方案1:更换为OLE DB连接
如果你的数据源支持OLE DB驱动,建议直接将Execute SQL Task的连接管理器从ODBC更换为OLE DB类型。这是最直接的解决方法,不需要调整现有结果集和变量的配置,就能消除报错。
3. 解决方案2:修改结果集类型(如果无法更换连接)
如果必须使用ODBC连接,你需要调整Execute SQL Task的结果集设置:
- 选择**"单行结果集"(Single Row Result Set)**:如果存储过程返回单行数据,这种方式可以正常捕获结果。
- 选择**"无结果集"(No Result Set)**:如果不需要捕获返回的结果,只是执行存储过程完成业务操作。
- 若确实需要获取多行结果集,可以拆分步骤:
- 先通过Execute SQL Task执行存储过程,将结果写入数据库临时表。
- 再使用另一个Execute SQL Task(ODBC连接)查询临时表,通过"逐行结果集"(ResultSet = "Rowset")或者数据流任务(Data Flow Task)来读取数据。
4. 额外检查:存储过程的输出确认
也可以先单独执行存储过程sp_ccdr,确认它确实返回了预期的结果集,避免是存储过程本身没有输出导致的问题。比如在数据库客户端执行:
call sp_ccdr ('2018-05-13 14:47:30', '2018-05-13 14:47:30', '0',null,null,null,null,null,null,null,null,null,'NULL','NULL','f')
验证是否能正常返回数据,排除存储过程本身的问题。
内容的提问来源于stack exchange,提问作者Abdulquadir Shaikh

