18

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

我确保这些文件没有在服务器上使用,甚至删除它们并将它们重新复制到服务器上,但我仍然遇到同样的错误。

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

4

6 回答 6

23

出现问题是因为在运行查询的凭据下无法访问运行 SQL 服务器服务的用户的 Temp 文件夹。尝试以最小的限制设置此临时文件夹的安全性。每次运行 openrowset 查询时创建的 dsn 可以重新创建而不会发生任何凭据冲突。这对我有用,没有任何重启要求。

于 2010-07-16T05:48:09.937 回答
6

我们最终重新启动了数据库服务器,这似乎解决了问题。也许文件以某种方式被锁定。我们永远不会确定

于 2009-09-23T11:25:47.747 回答
3

我必须在此处下载并安装“Microsoft Access Database Engine 2010 Redistributable” 。

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

于 2014-05-26T15:18:53.353 回答
1
/* 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
----------------------------------------------------------------------------------------------------------
于 2010-08-06T08:58:02.083 回答
0

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

于 2016-08-19T21:01:06.093 回答
0

我认为您使用 32 位驱动程序制作了 ODBC,但 SQL Server Management Studio 需要 64 位。因为当您想在 SQL Server 上为 MYSQL 创建链接服务器时,就会发生这种情况。因此,您应该让 DSN 系统用于 64 位驱动程序

于 2020-06-22T06:02:57.313 回答