使用 OPENROWSET 将 SQL 结果导出到 Excel,但提供程序尚未注册
Posted
技术标签:
【中文标题】使用 OPENROWSET 将 SQL 结果导出到 Excel,但提供程序尚未注册【英文标题】:Export SQL result to Excel by using OPENROWSET, but provider has not been registered 【发布时间】:2017-05-11 18:47:23 【问题描述】:我尝试使用以下查询将 sql 结果导出到 Excel:
INSERT INTO OPENROWSET
('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=c:\Test.xls;','SELECT client_name, Client_number FROM dbo.Client')
select * from dbo.client
但是我得到了这个错误:
Msg 7403, Level 16, State 1, Line 1
The OLE DB provider "Microsoft.Jet.OLEDB.4.0" has not been registered.
在我搜索了解决方法并下载了 2010 Microsoft Office System 文件“Access Database Engine 2010 Redistributable”后,当我运行上面的查询时,它仍然给我同样的错误。我将提供程序的名称更改为“Microsoft.ACE.OLEDB.12.0”并再次运行以下查询:
INSERT INTO OPENROWSET
('Microsoft.ACE.OLEDB.12.0',
'Excel 8.0;Database=c:\Test.xls;','SELECT client_name, Client_number FROM dbo.Client')
select * from dbo.client
它仍然给我这个错误:
Msg 7403, Level 16, State 1, Line 1
The OLE DB provider "Microsoft.ACE.OLEDB.12.0" has not been registered.
谁能告诉我这里发生了什么?
【问题讨论】:
可能是 64 位与 32 位版本的 access 数据库引擎的问题。试试64位驱动看看? 我刚刚安装的那个已经用于修复这个 64 位不兼容问题,它应该适用于大多数 64 位用户。不知道为什么它在我的电台上不起作用@JacobH 1) 您是否有 x64 或 x32 版本的 SQL Server?我的意思是 SQL Server,而不是您的操作系统 2) 您确定您已成功安装 Access Database Engine 2010 Redistributable? @sepupic 这是 x64 版本的 SQL,我用“select @@version”检查。我认为它已成功安装,因为它是由 IT 支持人员运行的。我们不允许自己在我们的工作站上安装任何东西 驱动程序不应该安装在您的工作站上,而应该安装在服务器上 【参考方案1】:总结一下:
为了使用 OPENROWSET 从/向 x64 SQL Server 导出/导入 excel 文件,您应该在您的服务器上安装 Access Database Engine 2010 Redistributable,而不是在您的工作站上。在您成功地在您的服务器 PC 上安装此 x64 位驱动程序之前,您将收到错误消息
The OLE DB provider "Microsoft.ACE.OLEDB.12.0" has not been registered
在您的 OPENROWSET 查询中尝试使用此提供程序时
【讨论】:
【参考方案2】:这适用于 16.0 或 12.0,如下所示.. 以管理员身份打开SSMS,否则无法正常工作。
运行
EXEC sp_MSset_oledb_prop
Microsoft.ACE.OLEDB.16.0 应该在那里。 如果上述结果中的 AllowInProcess 和 DynamicParameters 不是 1,则运行。
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.16.0'
, N'AllowInProcess', 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.16.0'
, N'DynamicParameters', 1
GO
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO
然后尝试:(确保电子表格已关闭!)
INSERT INTO OPENROWSET
('Microsoft.ACE.OLEDB.16.0',
'Excel 12.0;Database=c:\test.xls;','SELECT Column1 FROM [ExcelSheet$]')
select Column1 from dbo.SQLTable
Microsoft.ACE.OLEDB.16.0 可以从 https://www.microsoft.com/en-us/download/details.aspx?id=54920
以上内容也适用于 Microsoft.ACE.OLEDB.12.0
INSERT INTO OPENROWSET
('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;Database=c:\test.xls;','SELECT Column1 FROM [ExcelSheet$]')
select Column1 from dbo.SQLTable
在这种情况下
需要https://www.microsoft.com/en-ca/download/details.aspx?id=13255。
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0'
, N'AllowInProcess', 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0'
, N'DynamicParameters', 1
GO
您可以将 Excel 12.0 替换为以上 Excel 8.0。
【讨论】:
以上是关于使用 OPENROWSET 将 SQL 结果导出到 Excel,但提供程序尚未注册的主要内容,如果未能解决你的问题,请参考以下文章
将SQL查询分析器查询的结果用SQL语句导出到Excel表格的语句怎么写?
解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource
解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource
解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource&