普通网友 2026-05-10 16:20 采纳率: 98.9%
浏览 2
已采纳

SQL Server导入Excel时提示“未注册OLE DB提供程序”如何解决?

在SQL Server中通过SSIS、OPENROWSET或Linked Server导入Excel时,常报错:“未注册OLE DB提供程序‘Microsoft.ACE.OLEDB.12.0’或‘Microsoft.Jet.OLEDB.4.0’”。根本原因在于:64位SQL Server实例默认无法加载32位ACE/Jet驱动,且对应OLE DB驱动未安装或未启用。解决方案分三步:① 根据SQL Server位数(`SELECT @@VERSION`确认)安装匹配的Microsoft Access Database Engine(推荐2016+版ACE 16.0,支持.xlsx/.xls,注意卸载Office自带32位版本再安装64位引擎);② 在SQL Server Management Studio中启用“Ad Hoc Distributed Queries”(`sp_configure 'show advanced options',1; RECONFIGURE; sp_configure 'Ad Hoc Distributed Queries',1; RECONFIGURE`);③ 对ACE 12.0/16.0,需在“SQL Server外围配置器→功能→OLE DB提供程序”中右键启用对应提供程序(如Microsoft.ACE.OLEDB.16.0),并勾选“允许进程内”。完成后即可使用OPENROWSET正常读取Excel文件。
  • 写回答

1条回答 默认 最新

  • 白街山人 2026-05-10 16:20
    关注

    一、现象层:典型报错与使用场景还原

    在SQL Server企业级数据集成实践中,当通过以下任一方式读取Excel文件时,DBA或ETL工程师常遭遇统一错误:

    • OPENROWSET('Microsoft.ACE.OLEDB.16.0', ...) → 报错:“未注册OLE DB提供程序‘Microsoft.ACE.OLEDB.16.0’”
    • SSIS Excel Source组件 → 在64位运行时抛出 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)
    • Linked Server指向Excel → 执行 SELECT * FROM [EXCEL_SRV]...[Sheet1$] 失败,提示驱动不可用

    该问题高频出现在金融、政务、制造业等需频繁对接业务部门Excel报表的场景中,且仅在64位SQL Server实例上稳定复现——这已构成一个典型的“位数对齐失配”反模式。

    二、机理层:为什么64位SQL Server拒绝32位ACE/Jet?

    根本原因在于Windows进程模型与COM组件注册机制的深层约束:

    维度32位环境64位环境
    注册表路径HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CLSID\{...}HKEY_LOCAL_MACHINE\SOFTWARE\CLSID\{...}
    OLE DB提供程序加载SQL Server x86可加载Jet 4.0(已弃用)或ACE 12.0(32位)SQL Server x64仅能加载原生64位 ACE 16.0+,且必须显式启用
    Office共存冲突Office 365/2019默认安装32位ACE → 注册表项被屏蔽若未卸载32位引擎直接装64位 → 注册失败或静默降级

    三、诊断层:精准识别当前环境状态

    执行以下T-SQL确认关键事实(需sysadmin权限):

    -- 步骤1:确认SQL Server位数与版本
    SELECT @@VERSION AS [SQL_Server_Version];
    
    -- 步骤2:检查已注册的OLE DB提供程序
    SELECT * FROM sys.dm_exec_sessions WHERE session_id = @@SPID;
    SELECT * FROM sys.servers WHERE is_linked = 1;
    EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.16.0', N'AllowInProcess', 1;
    
    -- 步骤3:验证Ad Hoc Distributed Queries是否启用
    SELECT name, value_in_use FROM sys.configurations 
    WHERE name IN ('show advanced options', 'Ad Hoc Distributed Queries');

    四、解法层:三步闭环式修复方案(含避坑指南)

    1. 驱动安装:强制位数对齐
      ✅ 下载Microsoft Access Database Engine 2016 Redistributable (64-bit)
      ❌ 禁止:直接运行安装包(会因Office 32位存在而失败)→ 改用命令行静默安装:
      AccessDatabaseEngine_X64.exe /passive
      ⚠️ 关键前置动作:控制面板→卸载“Microsoft Access database engine 2010/2013 (32-bit)”
    2. SQL Server配置:解除即席查询限制
      EXEC sp_configure 'show advanced options', 1;
          RECONFIGURE;
          EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
          RECONFIGURE;
    3. OLE DB提供程序激活:图形化+命令双保险
      ▪ 打开 SQL Server外围配置器 → 功能 → OLE DB提供程序
      ▪ 右键 Microsoft.ACE.OLEDB.16.0 → 启用 + 勾选 允许进程内
      ▪ 补充T-SQL加固(防止策略重置):
      EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.16.0', N'AllowInProcess', 1;

    五、验证层:端到端测试用例与SSIS适配要点

    成功后执行下列验证语句(路径需替换为实际Excel文件):

    -- OPENROWSET标准语法(ACE 16.0)
    SELECT * FROM OPENROWSET(
      'Microsoft.ACE.OLEDB.16.0',
      'Excel 12.0;Database=C:\temp\data.xlsx;HDR=YES',
      'SELECT * FROM [Sheet1$]'
    );
    
    -- Linked Server创建(供长期复用)
    EXEC sp_addlinkedserver 
      @server = 'EXCEL_AC16',
      @srvproduct = '',
      @provider = 'Microsoft.ACE.OLEDB.16.0',
      @datasrc = 'C:\temp\data.xlsx',
      @provstr = 'Excel 12.0;HDR=YES';

    对于SSIS用户:在项目属性中将 Run64BitRuntime = False(仅开发调试),生产环境务必使用64位ACE + 64位SSIS Catalog部署。

    六、演进层:面向未来的替代架构建议

    尽管ACE驱动仍广泛使用,但微软已明确其非长期支持路径。高阶从业者应关注:

    • Power Query in SSIS:通过Script Component调用Power Query SDK,支持Parquet/CSV/Excel多源统一解析
    • Azure Data Factory:Excel作为源时自动选择PolyBase优化路径,规避本地驱动依赖
    • SQL Server 2022 + OPENJSON增强:推动业务方导出为结构化JSON/CSV,彻底脱离OLE DB技术栈

    本方案不仅解决当下故障,更构建了从紧急修复→标准化运维→架构演进的技术升级路径。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 5月11日
  • 创建了问题 5月10日