Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 无法为链接服务器null创建OLE DB提供程序Microsoft.Jet.OLEDB.4.0的实例_Sql_Sql Server_Export To Excel_Openrowset - Fatal编程技术网

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