OLE DB提供程序“Microsoft.ACE.OLEDB.12.0”对于链接服务器“(null)”

47

我试图运行以下语句,但是收到下面的错误消息。我已经进行了无数次的答案研究,但都没有起作用。我正在运行Office 365(64位)。我已经加载了Microsoft Access数据库引擎(64位)。这是在Visual Studio 2013与SSDT以及SQL Server 2012中。我无法访问更改SQL Server环境或启动参数的权限。任何帮助都将不胜感激。

SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.15.0', 
    'Excel 12.0;Database=C:\Users\UserName\Folder\SomeFile.xlsx;;HDR=NO;IMEX=1', [Table 1$])
  • Msg 7399,级别16,状态1,行1 OLE DB提供程序“Microsoft.ACE.OLEDB.15.0”针对链接服务器“(null)”报告了一个错误。提供程序没有提供有关错误的任何信息。
  • Msg 7303,级别16,状态1,行1 无法初始化与链接服务器“(null)”配套使用的OLE DB提供程序“Microsoft.ACE.OLEDB.15.0”的数据源对象。

这是我尝试过的:

首先,我运行了...

sp_configure 'show advanced options', 1;
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
GO

接着是...没有爱。

EXEC sys.sp_addsrvrolemember @loginame = N'<<Domain\User>>', @rolename = N'sysadmin';
GO

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.15.0', N'AllowInProcess', 1 
GO 
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.15.0', N'DynamicParameters', 1 
GO 

我已经修改了代码以读取 Microsoft.ACE.OLEDB.12.0,因为我也看到过这个,但仍然没有成功。

我还检查了 C:\Users\MSSQLSERVER\AppData\Local\Temp 和 C:Windows\ServiceProfiles\NetworkService\AppData\Local 的权限,并授予以下内容的完全控制权限:System、MSSQLSERVER和管理员,网络服务(对于后者)。

仍旧不成功。

最后,我尝试切换到 Microsoft Access 数据库引擎的 32 位版本,但依然无法工作。

有人能帮忙吗?


1
试试这个有趣的代码:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\UserName\Folder\SomeFile.xlsx;Extended Properties="Excel 12.0 Xml;HDR=NO;"。我一直在使用它与ADODB一起访问Excel 2007和2010文件,并且运行良好。 - JNevill
你能演示一下如何将这行代码加入到我上面的SELECT语句中吗?我无法理解,因为格式可能会被拒绝。谢谢! - Steven Kanberg
这可能有效。我不熟悉Visual Studio中的OPENROWSET语法,但我经常使用ADODB库。 SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Source=C:\Users\UserName\Folder\SomeFile.xlsx;Extended Properties="Excel 12.0 Xml;HDR=NO;"', [Table 1$]) - JNevill
在我的情况下,使用“sa”帐户连接到Sql服务器是有效的。每次我从Sql服务器打开Excel文件时,都需要使用“sa”帐户进行连接,而不是Windows帐户。 具体来说,在我的情况下,我在报告设计器中有一个报告。我必须进入“解决方案资源管理器”中的“共享数据源”,使用连接打开rds文件。然后我打开了“凭据”选项卡,并使用“sa”帐户进行修改。 - mihai71
25个回答

1
我遇到了完全相同的错误信息,并尝试了本主题中提出的建议解决方法,但都没有成功。
对我有用的解决方法是打开 .xlsx 文件并将其另存为 .xls(Excel 2003)文件。
也许该文件已损坏或处于不同的格式中,重新保存它可以修复问题。

1
即使运行了每个答案/博客上看到的所有EXEC存储过程命令,我仍然遇到了同样的问题,但是当我以管理员身份运行SSMS时,问题就消失了。由于我不想这样做,我打开了服务,进入SQL Server(MyServer),右键单击,选择属性。在登录选项卡中,“此帐户:”被选中,并列出了我的SQL Server帐户/密码。我改为选中“本地系统帐户”,并选中“允许服务与桌面交互”。然后我停止并启动了服务。现在,我可以在SSMS中不以管理员身份运行相同的查询,就像原始发布者提到的那样。这可能起作用是因为我正在我的家庭台式机上运行SQL Server。
我还想指出,您可以在SSMS中使用GUI启用adhoc访问(和许多其他选项)。在SSMS中,转到“链接服务器>提供程序”,右键单击提供程序,然后选择属性。然后您只需选中/取消要使用的选项即可。

1

我发现在调整SQL Server 2014下Excel上的链接服务器时,有两个关键的非显然设置。有了这些设置,' FROM OPENDATASOURCE(''Microsoft.ACE.OLEDB.16.0'', ...)'以及'... FROM [' + @srv_name + ']...data AS xl ...'可以正常运行。

创建链接服务器

这只是为了提供背景信息。

DECLARE @DB_NAME NVARCHAR(30) = DB_NAME();
DECLARE @srv_name nvarchar(64) = N'<srv_base_name>@' + @DB_NAME; --to distinguish linked server usage by different databases

EXEC sp_addlinkedserver
    @server=@srv_name,
    @srvproduct=N'OLE DB Provider for ACE 16.0',
    @provider= N'Microsoft.ACE.OLEDB.16.0',
    @datasrc= '<local_file_path>\<excel_workbook_name>.xlsx',
    @provstr= N'Excel 12.0;HDR=YES;IMEX=0'
;
  1. @datasrc:编码至关重要:使用varchar而不是nvarchar。
  2. @provstr:版本、设置和语法都很重要!
  3. @provider:指定已安装在SQL Server环境中的提供程序。可用的提供程序在SSMS的对象资源管理器下的服务器对象::链接服务器::提供程序中枚举。

为特定的SQL Server登录提供对链接服务器的访问权限

这是第一个至关重要的设置。 即使对于像SA这样的任何其他SQL Server登录账户也是如此:

EXEC sp_addlinkedsrvlogin @rmtsrvname = @srv_name, @locallogin = N'sa', @useself = N'False', @rmtuser = N'admin', @rmtpassword = N''
;
  1. @rmtuser: 应该是 admin。 实际上,在系统中没有任何同时登录的admin
  2. @rmtpassword: 应该是一个空字符串。

通过临时查询提供对链接服务器的访问权限

这是第二个关键设置。将Ad Hoc Distributed Queries设置为1是不够的。应明确将特定于驱动程序的DisallowAdhocAccess注册表键设置为0,以便针对指定的@provider进行设置:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.DEF_INST\Providers\Microsoft.ACE.OLEDB.16.0]
"DisallowAdhocAccess"=dword:00000000

0

这是我的错误代码:

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "The Microsoft Access database engine could not find the object 'ByStore$'. Make sure the object exists and that you spell its name and the path name correctly. If 'ByStore$' is not a local object, check your network connection or contact the server administrator.".

Msg 7350, Level 16, State 2, Procedure PeopleCounter_daily, Line 26

Cannot get the column information from OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

我的问题是路径中缺少Excel文件。只需将带有正确工作表的文件放入即可。


0

我尝试了Stackoverflow中提到的所有选项。但是我仍然遇到了相同的问题。但是通过先将其插入表格,然后再使用它来解决了这个问题。

来自:

select *  from OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
'Excel 8.0;Database=C:\Bharathi\Working\31012023_SSD\SSD.xlsx', 
'SELECT * FROM [Programs$]')

目标:先将数据插入到临时表中

 select * into #temp from OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 8.0;Database=C:\Bharathi\Working\18112022_Consoleforlob\data.xlsx',
'SELECT * FROM [Programs$]')

现在您可以使用 #temp 表查看结果。

Select * from #temp

0
  1. 关闭SQL Server Management Studio。在运行命令中键入Services.msc以打开服务窗口。

  2. 搜索SQL Server服务,右键单击它并选择属性。

  3. 在登录选项卡中,选择系统帐户/或选择您的域ID和帐户和密码。

  4. 一旦找到您的登录名,请按确定。

  5. 现在在两个字段中输入您的登录密码。

  6. 重新启动服务,以便应用新更改,如下图所示。

  7. 现在启动SQL Server Management Studio,尝试运行查询,如果仍然无法工作,请尝试系统重启。

... 或执行以下查询:

USE [master] 
GO 
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 

我认为值得注意的是,建议的解决方案要求您具有超级管理员角色才能进行更改并执行查询。错误信息: 消息 15003,级别 16,状态 1,过程 sp_MSset_oledb_prop,行 11 只有设置管理员角色的成员才能执行此存储过程。 - Rex Charles

0
在我的情况下,这个问题是因为我使用计算机名称从共享文件夹访问文件而导致的。 OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',''Excel 8.0;Database='\ntpc0100\MysharedFolder\KPI_tempData\VariablePayoutDetails.xls';IMEX=1;'','.....) 你应该指定你机器的IP地址,而不是使用计算机名称ntpc0100(无论你的机器名称是什么)。 例如:OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',''Excel 8.0; Database='\193.34.23.200\MysharedFolder\KPI_tempData\KPIVariablePayoutDetails.xls'....);


0
在我们的情况下,添加一个 SQL Server 服务参数是有帮助的:
  1. 进入 Services.msc,选择 SQL Server 服务并打开属性。
  2. 选择 启动参数 并添加新参数 -g512
  3. 重新启动 SQL Server 服务。

1
这是什么意思 -g512? - singhswat

0
除了先前提到的错误编号组合外,错误编号7399和7303都可能意味着文件已打开且文件甚至不是Excel文件。所以也要记住这一点。

这并不是对问题的回答。当您有足够的声望时,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Simas Joneliunas

0

3件导致错误的事情 -文件已打开 -需要完全读取/打开共享文件夹的权限 -文件受密码保护。

文件名区分大小写 例如:IMEX=1;Database=\FPTsite.mywebsite.com\E$\FTP\Folder1\FoldDer2\202202_MyFile.xlsx' 与 IMEX=1;Database=\FPTsite.mywebsite.com\E$\FTP\Folder1\FoldDer2\202202_myfile.xlsx'不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接