无法初始化链接服务器的OLE DB提供程序“MSDASQL”的数据源对象“(空)”

问题描述:

有一个有趣的问题。我正在通过Sql2005中的OpenRowset从服务器上的Excel文件中读取数据。我已经多次运行查询,没有任何问题。我刚刚出席了一个快速会议,突然间我收到错误“无法初始化链接服务器的OLE DB提供程序的数据源对象”MSDASQL“”(空)“”无法初始化链接服务器的OLE DB提供程序“MSDASQL”的数据源对象“(空)”

我已经确认文件没有在服务器上使用,甚至删除它们并将它们重新复制到服务器上,仍然出现同样的错误。

更新:这似乎只发生如果我加入两个选择从不同的openrowsets。如果我单独运行查询,它们仍然可以正常工作。我之前完成了加入,没有任何问题。想法?

问题出现的原因在于运行SQL Server服务的用户的Temp文件夹无法在查询运行的凭据下访问。尝试使用最小的限制来设置此临时文件夹的安全性。每次运行openrowset查询时创建的dsn都可以在没有任何凭证冲突的情况下重新创建。这对我没有任何重新启动要求。

+2

我在哪里可以找到这个Temp文件夹? – Slider345 2013-01-07 17:37:18

+3

对于我们的具体配置 - Windows Server 2008 R2,SQL Server 2008 R2 - 我们需要与域用户共享的特定TEMP文件夹是: 'C:\ Users \ \ AppData \ Local \ Temp' – fresh 2013-10-15 20:50:47

+1

我花了整整一天的时间 - 我不能相信这是解决方案!但它工作,所以我很高兴。 – Warren 2014-03-05 00:59:05

我们结束了重新启动数据库服务器,似乎解决了这个问题。也许这些文件以某种方式被锁定。我们永远不会知道,但

+0

服务器重启也适用于我。在执行输入的存储过程中结束脚本链接的服务器创建/删除操作。 – ajeh 2015-04-10 16:27:36

+0

重新启动服务器对我来说很有魅力。谢谢,我不能相信我花了多少时间来解决这个问题。谢谢 – 2015-12-14 14:20:15

/* Linked server between local(Client) SQL server and Remote SQL server 2005*/ 

USE master 
GO 
-- To use named parameters: Add linked server in the source (Local machine - eg: MachineName or LocalSeverLoginName) 

sp_addlinkedserver 
@server = N'LnkSrv_RemoteServer_TEST', 
@srvproduct=N'', -- Leave it blank when its not 'SQL Server' 
@provider=N'SQLNCLI', -- see notes 
@datasrc=N'RemoteServerName', 
@provstr=N'UID=sa;PWD=sa;' 
--,@catalog = N'MYDATABASE' eg: pubs 
GO 

/* 
Note: 
    To check provider name use the folling query in the destination server 
    Select Provider From sys.servers 
*/ 
---------------------------------------------------------------------------------------------------------- 
-- Optional 
--EXEC sp_addlinkedsrvlogin 'LnkSrv_RemoteServer_TEST', 'true' -- (self is true) -- for LocalSeverLoginName 
--GO 

-- Remote login 
sp_addlinkedsrvlogin 
@rmtsrvname = 'LnkSrv_RemoteServer_TEST', 
@useself = 'False', 
@rmtuser = 'sa', 
@rmtpassword = 'sa' 
GO 

-- OR 
/* 
IF the above add linked server login failed then try in the Linked Server (LnkSrv_RemoteServer_TEST) Property 
Select -> Security - > 'For a login not defined in the list above, Connection will:' 

Choose - > Be made using this security context 
SET Remote login: sa 
With password: sa 
*/ 
---------------------------------------------------------------------------------------------------------- 

-- Test server connection 
declare @srvr nvarchar(128), @retval int; 
set @srvr = 'LnkSrv_RemoteServer_TEST'; 
begin try 
    exec @retval = sys.sp_testlinkedserver @srvr; 
end try 
begin catch 
    set @retval = sign(@@error); 
end catch; 
if @retval <> 0 
    raiserror('Unable to connect to server. This operation will be tried later!', 16, 2); 

-- OR 

BEGIN TRY 
    EXEC sp_testlinkedserver N'LnkSrv_RemoteServer_TEST'; 
END TRY 
BEGIN CATCH 
    PRINT 'Linked Server not available'; 
    RETURN; 
END CATCH 
---------------------------------------------------------------------------------------------------------- 

-- Get access linked server database 
SET xact_abort ON 
GO 

BEGIN TRANSACTION 
SELECT * FROM LnkSrv_RemoteServer_TEST.DBName.dbo.tblName 
COMMIT TRAN 
GO 

-- OR 
SELECT * FROM OPENQUERY(LnkSrv_RemoteServer_TEST, 'SELECT * FROM DBName.dbo.tblName') 
GO 

-- OR 
SELECT * FROM OPENQUERY(LnkSrv_RemoteServer_TEST, 'SELECT * FROM sys.databases Order by name') 
GO 
---------------------------------------------------------------------------------------------------------- 

我必须下载并安装“Microsoft Access数据库引擎2010可再发行组件”可用here

“导致此问题的原因是64位Windows Server 2003上实际上没有安装64位ODBC文本驱动程序,64位MSDASQL只是提供了一个OLEDB/ODBC”桥“,允许构建应用程序在OLEDB和ADO(内部使用OLEDB)通过ODBC驱动程序访问数据源。“ Source

这个问题也发生在我身上。启用OraOLEDB.Oracle的“Allow inprocess”提供程序选项(SSMS>服务器对象>链接服务器>提供> OraOLEDB.Oracle)的组合,重新启动SQL Server Windows服务并最后调整TNSNAMES.ora文件的权限直。