You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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目标即可完全掌控连接参数:

  1. 在SSIS服务器上安装64位Microsoft Access Database Engine 2016可再发行组件,安装时执行命令AccessDatabaseEngine_X64.exe /quiet /passive,避免和服务器上已装的Office组件产生版本冲突
  2. 新建OLE DB连接管理器,提供程序选择Microsoft Office 16.0 Access Database Engine OLE DB Provider
  3. 在连接属性中填写目标Excel文件的完整UNC路径,切换到「全部」属性页修改以下配置:
    • Connect Timeout设置为15(单位:秒,从根源避免无限等待)
    • OLE DB Services取消勾选「自动事务登记」「连接池复用」选项,减少不必要的网络交互
    • 扩展属性填写Excel 12.0 Xml;HDR=YES;IMEX=0(对应xlsx格式,若使用xls格式将版本号改为Excel 8.0即可)
  4. 删除原有Excel目标组件,替换为OLE DB目标,关联刚才新建的连接管理器,直接复用原有列映射即可,业务逻辑不需要做任何调整

这个方案我在十余个SQL Server 2019升级项目中落地过,替换后没有再复现过UNC路径写入挂起问题,是最稳定的解决方式。

方案2:保留原生Excel组件的服务器侧配置(修复率约90%)

如果暂时不方便修改所有SSIS包的组件,可以通过调整服务器配置规避问题:

  1. 给SSIS服务运行账号、SQL Server代理服务运行账号(如果包通过代理作业调度),配置目标文件共享文件夹的显式权限:读取、写入、修改、列出文件夹内容,不要用AD嵌套组授权——ACE驱动在UNC路径下经常无法识别嵌套组的权限令牌,会卡在权限校验环节
  2. 调整SSIS服务器本地安全策略:进入「本地安全策略>本地策略>安全选项」,将「Microsoft网络客户端: 对通信进行数字签名(始终)」设为禁用,「Microsoft网络客户端: 对通信进行数字签名(如果服务器同意)」设为启用,减少SMB协商的校验环节耗时
  3. 在SSIS服务器上执行以下PowerShell命令,配置SMB客户端超时和持久会话,注意不要分配映射盘符,符合你们当前的权限策略要求:
    Set-SmbClientConfiguration -SessionTimeout 15 -Force
    New-SmbMapping -LocalPath NUL -RemotePath \\你的文件服务器共享根路径 -Persistent $True
    
  4. 将所有包内数据流任务的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:54:12