Sql 无法为链接服务器null创建OLE DB提供程序Microsoft.Jet.OLEDB.4.0的实例
我正试图通过Sql 无法为链接服务器null创建OLE DB提供程序Microsoft.Jet.OLEDB.4.0的实例,sql,sql-server,export-to-excel,openrowset,Sql,Sql Server,Export To Excel,Openrowset,我正试图通过T-SQL查询将表中的数据导出到Excel。经过一番研究,我得出了这个结论 INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=G:\Test.xls;', 'SELECT * FROM [Sheet1$]') SELECT * FROM dbo.products 当我执行上面的查询时
T-SQL
查询将表中的数据导出到Excel
。经过一番研究,我得出了这个结论
INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0',
'Excel 8.0;Database=G:\Test.xls;',
'SELECT * FROM [Sheet1$]')
SELECT *
FROM dbo.products
当我执行上面的查询时,我得到了这个错误
Msg 7302,级别16,状态1,第7行无法创建OLE实例
链接服务器的数据库提供程序“Microsoft.Jet.OLEDB.4.0”(空)
所以通过互联网寻找解决方案,得到了下面的链接
在上面的链接中,他们说我们需要成为管理员才能在C驱动器TEMP
文件夹中创建文件夹,因为OPENROWSET
在TEMP
文件夹中创建了一些文件或文件夹
我在家里的电脑上做这件事,我是管理员。我仍然得到同样的错误
SQL SERVER详细信息
Microsoft SQL Server 2016(RC1)-13.0.1200.242(X64)2016年3月10日
16:49:45版权所有(c)微软公司企业评估
Windows 10 Pro 6.3上的版本(64位)(内部版本10586:)
任何解决问题的建议都将受到高度赞赏
更新:我已经配置了临时分布式查询
和
执行以下查询
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 1
GO
现在我得到了这个错误
Msg 7438,16级,状态1,第7行32位OLE DB提供程序
“Microsoft.Jet.OLEDB.4.0”无法在64位SQL上的进程内加载
服务器
查看sp_配置/重新配置
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO
有关更多信息,请参见以下链接:
我有MS Sql server 2012和Office 2013。这似乎非常挑剔,因此您可能需要调整以适应特定的版本
下载Microsoft.ACE.OLEDB.12.0 for Windows,64位版本可在此处找到:
在服务器上安装它
检查运行SQL Server的用户,并确保用户可以访问临时目录C:\Windows\ServiceProfiles\LocalService\AppData\Local\temp(如果是本地服务帐户),或者C:\Windows\ServiceProfiles\NetworkService\AppData\Local\temp(如果是网络服务帐户)
配置“临时分布式查询”并启用Microsoft.ACE.OLEDB文件,如下所示:
以下是SP_CONFIGURE命令:
SP_CONFIGURE 'show advanced options', 1;
GO
RECONFIGURE;
SP_CONFIGURE 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParam', 1
在较新的SQL Server 2014上,您使用了'DynamicParameters'
而不是'DynamicParameters'
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1
请确保按如下方式注册msexcl40.dll:
regsvr32 C:\Windows\SysWOW64\msexcl40.dll
工作!!!非常感谢。
仅适用于64位Win服务器2012R2。让我将整个工作脚本部分重复上面的部分,这些部分(对我来说)不容易组合在一起:
下载Microsoft.ACE.OLEDB.12.0 for Windows,64位版本可在此处找到:
创建包含相应列(本例中为名称和类)的excel文件
运行以下代码:
sp_配置“显示高级选项”,1;
重新配置;
去
sp_配置“临时分布式查询”,1;
重新配置;
去
--直到SQL Server 2012
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.oledb.12.0',N'AllowInProcess',1
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.oledb.4.0',N'AllowInProcess',1
--SQL Server 2014或更高版本
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.oledb.4.0',N'DynamicParameters',1
EXEC sp_MSset_oledb_prop N'Microsoft.ACE.oledb.12.0',N'DynamicParameters',1
--现在可以导出到Excel
插入到OPENROWSET('Microsoft.ACE.OLEDB.12.0',
“Excel 8.0;数据库=C:\testing.xlsx;”,
'从[Sheet1$]中选择名称、类')
从Qry_2中选择[名称],[类别]
去
--或从Excel导入
从OPENROWSET('Microsoft.ACE.OLEDB.12.0'中选择*,
“Excel 8.0;数据库=c:\targetWorkbook.xls;”,
'从[targetSheet$]中选择*')
请执行以下查询以解决此问题:
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 1
GO
此SO链接可能会对您有所帮助我注意到的另一点是,在insert语句中,它应该是-insert到OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=G:\Test.xls;','SELECT*FROM[Sheet1$]'),而不是SELECT*FROM dbo.products
SQL进程和OLEDB驱动程序之间可能存在64/32位问题?SQL Server和MS Office(或仅OLEDB驱动程序)都必须是64位版本。这里的更多信息你可以安装ACE驱动程序而不是Jet驱动程序并使用OPENROWSET吗('Microsoft.ACE.OLEDB.12.0',抱歉。我将尝试将其余内容放在评论中。我想我已经得到了保护,不会发布太长的字符串。以下是SP_CONFIGURE命令:SP_CONFIGURE'show advanced options',1;GO RECONFIGURE;SP_CONFIGURE'Ad Hoc Distributed querys',1;GO RECONFIGURE;EXEC SP_MSset_OLEDB_prop N'Microsoft.ACE.OLEDB.12.0',N'AllowInProcess',1 EXEC sp_MSset_oledbu prop N'Microsoft.ACE.OLEDB.12.0',N'DynamicParam',1
确保您像这样注册msexcl40.dll:regsvr32 C:\Windows\SysWOW64\msexcl40.dll
基本思想是创建链接服务器并确保您的excel格式与您的查询匹配让我输入正确的语法。我将在另一台计算机上尝试此操作。在SQL Server 2014上,我必须“EXEC sp_configure”并使用“DynamicParameters”而不是“DynamicParameters”。
-- Now you can export to Excel
INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 8.0;Database=C:\testing.xlsx;',
'SELECT Name, Class FROM [Sheet1$]')
SELECT [Name],[Class] FROM Qry_2
GO
-- Or import from Excel
select * from OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 8.0;Database=c:\targetWorkbook.xls;',
'SELECT * FROM [targetSheet$]')
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'AllowInProcess', 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.Jet.OLEDB.4.0', N'DynamicParameters', 1
GO