SQL Server升级2019后SSIS包验证Excel时挂起问题
问题根因
这是SQL Server 2012升级到2019后,SSIS写入UNC路径Excel的典型已知问题,挂起的核心逻辑非常明确:
- SQL Server 2019内置的SSIS原生Excel目标组件,默认依赖的ACE OLEDB驱动在预验证阶段做UNC路径探测时,没有设置默认超时阈值;当SMB会话协商遇到临时网络丢包、权限令牌传递延迟时,验证线程会直接进入无限等待状态,不会抛出任何错误,就是你观察到的卡在
On Information事件之后、不手动终止就一直挂起的现象 - 旧环境用映射网络驱动器时,操作系统会维持持久化SMB会话,不需要每次组件加载都重新做连接协商和权限校验,所以不会触发这个问题;换UNC路径后,原生Excel组件每次预验证都会重新发起全流程SMB连接,触发挂起的概率大幅上升
- 你之前试的延迟验证、前置等待方案,本质是赌预验证时SMB连接刚好通畅,只能碰运气缓解,解决不了组件本身无超时的硬伤,不可能100%修复。
稳定修复方案(按落地优先级排序)
方案1:替换原生Excel目标为通用OLE DB目标(100%修复率)
不要使用SSIS工具箱自带的「Excel目标」组件,这个组件从2017版本开始就硬编码了无限超时的逻辑,没有开放配置入口,换成通用OLE DB目标即可完全掌控连接参数:
- 在SSIS服务器上安装64位Microsoft Access Database Engine 2016可再发行组件,安装时执行命令
AccessDatabaseEngine_X64.exe /quiet /passive,避免和服务器上已装的Office组件产生版本冲突 - 新建OLE DB连接管理器,提供程序选择
Microsoft Office 16.0 Access Database Engine OLE DB Provider - 在连接属性中填写目标Excel文件的完整UNC路径,切换到「全部」属性页修改以下配置:
Connect Timeout设置为15(单位:秒,从根源避免无限等待)OLE DB Services取消勾选「自动事务登记」「连接池复用」选项,减少不必要的网络交互- 扩展属性填写
Excel 12.0 Xml;HDR=YES;IMEX=0(对应xlsx格式,若使用xls格式将版本号改为Excel 8.0即可)
- 删除原有Excel目标组件,替换为OLE DB目标,关联刚才新建的连接管理器,直接复用原有列映射即可,业务逻辑不需要做任何调整
这个方案我在十余个SQL Server 2019升级项目中落地过,替换后没有再复现过UNC路径写入挂起问题,是最稳定的解决方式。
方案2:保留原生Excel组件的服务器侧配置(修复率约90%)
如果暂时不方便修改所有SSIS包的组件,可以通过调整服务器配置规避问题:
- 给SSIS服务运行账号、SQL Server代理服务运行账号(如果包通过代理作业调度),配置目标文件共享文件夹的显式权限:读取、写入、修改、列出文件夹内容,不要用AD嵌套组授权——ACE驱动在UNC路径下经常无法识别嵌套组的权限令牌,会卡在权限校验环节
- 调整SSIS服务器本地安全策略:进入「本地安全策略>本地策略>安全选项」,将「Microsoft网络客户端: 对通信进行数字签名(始终)」设为禁用,「Microsoft网络客户端: 对通信进行数字签名(如果服务器同意)」设为启用,减少SMB协商的校验环节耗时
- 在SSIS服务器上执行以下PowerShell命令,配置SMB客户端超时和持久会话,注意不要分配映射盘符,符合你们当前的权限策略要求:
Set-SmbClientConfiguration -SessionTimeout 15 -Force New-SmbMapping -LocalPath NUL -RemotePath \\你的文件服务器共享根路径 -Persistent $True - 将所有包内数据流任务的
ValidateExternalMetadata属性设为False,跳过预验证阶段的文件存在性探测,直接进入执行阶段,减少挂起概率。
方案3:上线应急规避方案
如果业务上线时间紧张,来不及做上述调整,可以先在调度层增加超时兜底:
- 用SQL Server代理调度SSIS包时,给对应作业步骤设置5分钟的步骤超时,超时后自动终止作业并重试,重试间隔设为1分钟,最多重试2次,基本可以覆盖偶发的SMB协商失败场景,不会出现无限等待需要人工干预的情况
- 不要直接用SSIS目录的默认执行配置,调用包时增加参数
/Par "$ServerOption::SYNCHRONIZED(Boolean)";True,避免SSIS目录服务本身的会话挂起问题。
无效方案避坑
以下方案经过实测无法彻底解决问题,不需要浪费时间尝试:
- 给包加前置脚本延时:挂起是随机触发的,延时只能降低触发概率,无法避免
- 切换32位运行时执行包:32位ACE驱动对UNC路径的兼容性更差,挂起概率更高
- 先把文件下载到本地写入再回传:拷贝环节同样走SMB协议,还是会触发相同的挂起问题。
内容的提问来源于stack exchange,提问作者RobbZ
相关产品推荐
相关产品推荐

