Не удается инициализировать объект источника данных поставщика OLE DB "MSDASQL" для связанного сервера "(null)"

Имеет интересную проблему. Я читаю из файла excel на сервере через OpenRowset в Sql2005. Я запускаю запрос несколько раз без каких-либо проблем. Я только что вышел для быстрой встречи, и вдруг я получаю сообщение об ошибке "Не удается инициализировать объект источника данных поставщика OLE DB" MSDASQL "для связанного сервера" (null) ""

Я убедился, что файлы не используются на сервере и даже удалили их и переработали на сервер, и все же я получаю ту же ошибку.

UPDATE: Это происходит только в том случае, если я присоединяю два выбора из разных openrowsets. Если я запускаю запросы отдельно, они все равно работают нормально. Я сделал это до того, чтобы не возникнуть никаких проблем. Идеи?

Ответ 1

Проблема возникает из-за того, что папка Temp пользователя, в которой работает служба SQL-сервера, недоступна под учетными данными, которые выполняются в запросе. Постарайтесь установить защиту этой временной папки с минимальными ограничениями. Dsn, который создается каждый раз при запуске запроса openrowset, может быть воссоздан без конфликтов полномочий. Это работало для меня без каких-либо требований к перезагрузке.

Ответ 2

Мы закончили перезагрузку сервера баз данных, и это, похоже, решило проблему. Может быть, файлы как-то блокировались. Мы никогда не узнаем наверняка, хотя

Ответ 3

Мне пришлось загрузить и установить "Распространяемый Microsoft Access Database Engine 2010" доступный здесь.

"Причиной этой проблемы является то, что на вашем 64-разрядном сервере Windows 2003 не установлен 64-битный текстовый драйвер ODBC. 64-разрядный MSDASQL предоставляет только мост OLEDB/ODBC, который позволяет создавать приложения на основе OLEDB и ADO (который использует OLEDB внутри) для доступа к источникам данных через драйверы ODBC". Источник

Ответ 4

/* 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
----------------------------------------------------------------------------------------------------------

Ответ 5

Эта проблема со мной тоже. Комбинация включения опции поставщика "Разрешить inprocess" для OraOLEDB.Oracle(SSMS > Объекты серверa > Связанные серверы > Предоставляет > OraOLEDB.Oracle), перезапуск службы SQL Server Windows и окончательная настройка разрешений в файле TNSNAMES.ora непосредственно.