运行SSIS包时出现连接字符串参数错误问题求助
问题场景
VS 2022构建的SSIS包部署到SQL Server 2019实例,父包通过参数传递源/目标数据库连接字符串给子包:
- 源和目标均为本地实例时运行正常
- 切换到其他服务器/数据库(如Azure SQL)时,触发
0x80070057错误,提示“参数不正确”,即使将所有包的TransactionOption改为Not Supported仍报错
错误详情:
Package1:Error: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80070057.
COM error object information is available. Source: "Package1" error code: 0x80070057 Description: "The SSIS Runtime has failed to enlist the OLE DB connection in a distributed transaction with error 0x80070057 "The parameter is incorrect.".
".
包逻辑:删除目标临时表数据 → 源数据复制到目标临时表 → 删除目标主表数据 → 临时表数据复制到主表
排查与解决步骤
1. 替换OLE DB驱动
原连接字符串使用SQLNCLI11驱动,该驱动对云数据库(如Azure SQL)的分布式事务支持有限,建议替换为最新的MSOLEDBSQL驱动:
Data Source=tcp:mysite.database.windows.net,1111;Initial Catalog=MyBd;Provider=MSOLEDBSQL;User ID=MyUser;Password=mypass123;Auto Translate=false
注意:去掉连接字符串末尾多余的分号,避免解析异常。
2. 调整连接管理器属性
- 打开子包的连接管理器,找到对应连接的RetainSameConnection属性,设置为
True,避免每次操作重建连接时触发不必要的事务尝试。 - 确认连接管理器的TransactionOption也设置为
Not Supported,确保组件层面禁用事务。
3. 验证参数传递完整性
在子包中添加脚本任务,打印接收到的连接字符串参数,确认参数没有被截断、转义或篡改。例如在C#脚本中输出参数值:
bool fireAgain = true; string connStr = Dts.Variables["User::YourConnectionParam"].Value.ToString(); Dts.Events.FireInformation(0, "Debug", $"Received connection string: {connStr}", "", 0, ref fireAgain);
4. 检查执行账户权限
- 确认执行SSIS包的账户(如SQL Server代理账户或本地执行账户)拥有目标服务器(含Azure SQL)的登录权限、数据库读写权限。
- 如果是Azure SQL,确保该账户不在禁用状态,且IP地址在Azure SQL的防火墙允许列表内。
5. 备选:MSDTC配置排查(若仍涉及事务)
如果上述操作无效,即使设置了Not Supported,仍需检查本地SQL Server实例的MSDTC服务:
- 确保MSDTC服务已启动
- 防火墙允许MSDTC的端口通信(默认135端口及动态端口)
内容的提问来源于stack exchange,提问作者DarkW1nter

