有一个有趣的问题。我正在通过Sql2005中的OpenRowset从服务器上的excel文件中读取。我已经多次运行查询而没有任何问题。我刚刚出去参加快速会议,突然间我收到错误“无法初始化OLE DB提供程序的数据源对象”MSDASQL“for linked server”(null)“”
我确保文件没有在服务器上使用,甚至删除它们并将它们重新复制到服务器上,但我仍然遇到同样的错误。
更新:如果我从不同的openrowsets加入两个选择,这似乎只会发生。如果我单独运行查询,他们仍然可以正常工作。我之前没有任何问题就完成了加入。想法?
答案 0 :(得分:18)
问题出现是因为运行SQL Server服务的用户的Temp文件夹无法在运行查询的凭据下访问。尝试以最小限制设置此临时文件夹的安全性。每次运行openrowset查询时创建的dsn都可以在没有任何凭据冲突的情况下重新创建。这对我有用,没有任何重启要求。
答案 1 :(得分:5)
我们最终重新启动了数据库服务器,这似乎解决了这个问题。也许文件以某种方式被锁定。我们永远不会确切知道
答案 2 :(得分:3)
我必须下载并安装“Microsoft Access数据库引擎2010可再发行组件”here。
“问题的原因是64位Windows Server 2003上实际上没有安装64位ODBC文本驱动程序.64位MSDASQL只提供了一个OLEDB / ODBC”桥接器,允许构建在其上的应用程序OLEDB和ADO(内部使用OLEDB)通过ODBC驱动程序访问数据源。“ Source
答案 3 :(得分: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
----------------------------------------------------------------------------------------------------------
答案 4 :(得分:0)
这个问题也发生在我身上。为OraOLEDB.Oracle提供“允许进程内”提供程序选项的组合(SSMS&gt;服务器对象&gt;链接服务器&gt;提供&gt; OraOLEDB.Oracle),重新启动SQL Server Windows服务并最后调整权限TNSNAMES.ora文件直接。
答案 5 :(得分:0)
我认为您使用32位驱动程序制作了ODBC,但SQL Server Management Studio需要64位。因为要在SQL Server上为MYSQL创建链接服务器时发生了这种情况。因此,您应该使DSN系统用于64位驱动程序