我试图运行以下语句但是接收到下面的错误消息。我已经研究过没有尽头的答案,没有一个对我有用。我正在运行Office 365(64位)。我已加载Microsoft Access数据库引擎(64位)。这是在带有SSDT的Visual Studio 2013以及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$])
以下是我的尝试:
首先,我跑了......
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的权限,这些权限已授予对以下内容的完全控制权:系统,MSSQLSERVER和管理员,网络服务(关于后者)。
仍然没有爱。
最后,我尝试更改为32位版本的Microsoft Access数据库引擎,该版本一直无法正常工作。
帮助,有人吗?
答案 0 :(得分:18)
我没有改变用户,而是找到了这个建议:
在尝试每个解决方案之后,这可能会帮助其他人 在SQL 64上尝试并修复此错误..
无法初始化OLE DB提供程序的数据源对象 “Microsoft.ACE.OLEDB.12.0”用于链接服务器“(null)”。
..我在这里找到了一篇文章......
http://sqlserverpedia.com/blog/sql-server-bloggers/too-many-bits/
..这表明我给了每个人这个文件夹的完全权限..
C:\ Users \ SQL Service帐户名\ AppData \ Local \ Temp
嘿嘿!我的疑问突然爆发了。我打了一拳 很高兴。
Edwaldo
答案 1 :(得分:15)
这解决了这个问题。 出于某种原因,SQL Server不喜欢默认的MSSQLSERVER帐户。将其切换到本地用户帐户可以解决问题。
答案 2 :(得分:15)
这是我的参考,因为我在尝试与提供程序连接时遇到了各种SQL错误消息。其他答案规定“试试这个,然后这个,然后这个”。我很欣赏其他答案,但我喜欢将特定解决方案与特定问题配对
错误强>
...提供商未提供信息...无法初始化数据源对象...
错误号
7399,7303
错误明细
Msg 7399, Level 16, State 1, Line 2 The OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" reported an error.
The provider did not give any information about the error.
Msg 7303, Level 16, State 1, Line 2 Cannot initialize the data source object
of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".
<强>解决方案强>
文件已打开。关闭它。
<强>信用卡强>
错误强>
访问被拒绝...无法获取列信息...
错误号
7399,73 50
错误明细
Msg 7399, Level 16, State 1, Line 2 The OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" reported an error.
Access denied.
Msg 7350, Level 16, State 2, Line 2 Cannot get the column information
from OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".
<强>解决方案强>
授予访问权限
<强>信用卡强>
错误强>
没有给出一个或多个必需参数的值....无法执行查询...
错误号
??? ,73 20
错误明细
OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "No value given for one or more required parameters.".
Msg 7320, Level 16, State 2, Line 2
Cannot execute the query "select [Col A], [Col A] FROM $Sheet" against OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".
<强>解决方案强>
列名可能有误。您的电子表格中确实存在[Col A]
和[Col B]
吗?
错误强>
“未指定的错误”...无法初始化数据源对象...
错误号
??? ,7303
错误明细
OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "Unspecified error".
Msg 7303, Level 16, State 1, Line 2 Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".
<强>解决方案强>
以管理员身份运行SSMS。见this question.
其他参考资料
其他建议修改属性的答案。不确定如何修改这两个属性(检查它们或取消选中它们)会有所帮助。
答案 3 :(得分:14)
确保Excel文件未打开。
答案 4 :(得分:2)
在SQL Server中,请尝试以下步骤:
Server Object
。Linked Servers
。Providers
。Microsoft.ACE.OLEDB.12.0
,然后点击Properties
。答案 5 :(得分:2)
具体来说,只有在查询的Excel文件未打开时才有效,而在以我身份运行SQL Server服务时 [作为具有访问权限的用户到文件系统]。我看到我的答案已经在其他地方给出,所以我为任何冗余道歉,但为了更简洁的答案:
USE [master]
GO
EXEC sp_configure 'Show Advanced Options', 1
RECONFIGURE
GO
EXEC sp_configure 'Ad Hoc Distributed Queries', 1
RECONFIGURE
GO
EXEC sp_MSSet_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
GO
EXEC sp_MSSet_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1
GO
SELECT *
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;Database=C:\MyExcelFile.xlsx',
'SELECT * FROM [MyExcelSheetName$]')
答案 6 :(得分:1)
我在Windows 10上运行EXEC sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 0
。我尝试了所有内容,使其发挥作用的是:
features
我不知道为什么关闭AllowInProcess使它工作但这是我的关键。感谢您关于在链接服务器上关闭所有选项的建议。
答案 7 :(得分:1)
即使运行了所有在每个答案/博客上看到的所有EXEC存储过程命令,我仍然遇到相同的问题,但是当我以管理员身份运行SSMS时,问题就消失了。因为我不想这样做,所以我打开了Services,转到SQL Server(MyServer),单击鼠标右键,选择了属性。在“登录”选项卡上,选择了“此帐户:”并列出了我的SQL Server帐户/密码。相反,我选中了“本地系统帐户”,并勾选了“允许服务与桌面交互”。然后我停止并启动了服务。现在,我可以运行与原始海报提及的查询相同的查询,而无需在SSMS中以管理员身份运行。这可能有用,因为我在家用台式机上运行SQL Server。
我还要指出,您可以在SSMS中使用GUI来启用即席访问(以及许多其他选项)。在SSMS中,转到“链接服务器”>“提供程序”,右键单击提供程序,然后选择属性。然后,您可以选中/取消选中所需的内容。
答案 8 :(得分:1)
使用SQL 2014,我将SQL Server服务(MSSQL)更改为LocalSystem
。这解决了我的问题。
根据我的记忆,它曾经在2008年以NT_SERVICE\MSSQL$MSSQL
的形式工作。
答案 9 :(得分:0)
从numpy.where
删除只读复选框对我有用。
答案 10 :(得分:0)
在我们的例子中,它有助于为SQL Server服务添加参数:
Services.msc
,选择“SQL Server服务”
并打开属性。 Startup Parameters
并添加新内容
参数–g512
答案 11 :(得分:0)
对我来说,这两件事在不同场合有帮助:
1)如果您刚刚安装了MS Access运行时,请重新启动服务器。弹跳数据库实例还不够。
2)在确保未打开Excel文件的同时,请确保您没有在打开预览窗格的情况下打开Windows资源管理器-也将其锁定。不要着急。
答案 12 :(得分:0)
在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'
;
@datasrc
:此处的编码至关重要:使用varchar而不是
n varchar。@provstr
:版本,设置和语法很重要!@provider
:指定安装在SQL Server环境中的提供程序。在SSMS的对象资源管理器的Server Objects::Linked Servers::Providers
下枚举了可用的提供程序。这是第一个关键设置。
甚至对于SA
就像其他任何SQL Server登录一样:
EXEC sp_addlinkedsrvlogin @rmtsrvname = @srv_name, @locallogin = N'sa', @useself = N'False', @rmtuser = N'admin', @rmtpassword = N''
;
@rmtuser
:应该为admin
。实际上,在同一时间,系统上的Windows登录中没有任何admin
。@rmtpassword
:应该为空字符串。这是第二个关键设置。
仅将Ad Hoc Distributed Queries
设置为1是不够的。
对于为0
指定的驱动程序,应将DisallowAdhocAccess
注册表项显式设置为@provider
:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.DEF_INST\Providers\Microsoft.ACE.OLEDB.16.0]
"DisallowAdhocAccess"=dword:00000000
答案 13 :(得分:0)
对我来说,这是该文件文件夹中的权限。我必须为用户“所有人”添加所有权限。 文件夹/属性/安全->向用户添加所有人并设置所有权限。
答案 14 :(得分: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文件。只需将文件与正确的表格放在一起即可。
答案 15 :(得分:0)
我有完全相同的错误消息,并在此主题中尝试了建议的解决方案,但没有成功。
解决了我的问题是打开.xlsx文件并将其保存为.xls(excel 2003)文件。
可能文件已损坏或格式不同,并再次保存已修复它。
答案 16 :(得分:0)
{{1}}
答案 17 :(得分:0)
对我而言,这两件事在不同场合都有所帮助:
1)如果您刚刚安装了MS Access运行时,请重新启动服务器。弹跳数据库实例是不够的。
2)除了确保Excel文件没有打开外,请检查您是否打开了Windows资源管理器并打开预览窗格 - 这也会锁定它。
答案 18 :(得分:0)
在我的情况下出现此问题是因为我使用computerName从共享文件夹访问该文件。 OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',''Excel 8.0; Database ='\ ntpc0100 \ MysharedFolder \ KPI_tempData \ VariablePayoutDetails.xls'; IMEX = 1;'','.....) 使用computerName ntpc0100(无论您的机器名称是什么),您应该指定机器的IP地址。 例如: - OPENROWSET(''Microsoft.Jet.OLEDB.4.0'',''Excel 8.0; Database ='\ 193.34.23.200 \ MysharedFolder \ KPI_tempData \ KPIVariablePayoutDetails.xls'....);
答案 19 :(得分:0)
关闭SQL Server Management Studio。在run命令中键入Services.msc以打开服务窗口。
搜索SQL Server服务并右键单击它并选择属性。
在“登录”选项卡中,选择系统帐户/或选择您的域名和帐户及密码。
找到您的登录名后,按“确定”。
现在在两个字段中输入您的登录密码。
重新启动服务,以便应用新的更改,如下图所示。
现在启动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