在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');四、解法层:三步闭环式修复方案(含避坑指南)
- 驱动安装:强制位数对齐
✅ 下载Microsoft Access Database Engine 2016 Redistributable (64-bit)
❌ 禁止:直接运行安装包(会因Office 32位存在而失败)→ 改用命令行静默安装:
AccessDatabaseEngine_X64.exe /passive
⚠️ 关键前置动作:控制面板→卸载“Microsoft Access database engine 2010/2013 (32-bit)” - SQL Server配置:解除即席查询限制
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE; - 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技术栈
本方案不仅解决当下故障,更构建了从紧急修复→标准化运维→架构演进的技术升级路径。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报