Не удалось инициализировать объект источника данных поставщика OLE DB "MSDASQL" для связанного сервера "(null)"
Имея интересную проблему. Я читаю из файла Excel на сервере через OpenRowset в Sql2005. Я запускал запрос несколько раз без проблем. Я только что вышел на быстрое собрание и внезапно получаю сообщение об ошибке "Не удается инициализировать объект источника данных поставщика OLE DB"MSDASQL"для связанного сервера"(null)""
Я убедился, что файлы не используются на сервере, и даже удалил их, переписал их на сервер, и все же я получаю ту же ошибку.
ОБНОВЛЕНИЕ: Это, кажется, случается, только если я соединяю два выбора из различных открытых наборов Если я запускаю запросы по отдельности, они все еще работают нормально. Я сделал соединение раньше без каких-либо проблем. Идеи?
7 ответов
Проблема возникает из-за того, что папка Temp пользователя, под которой работает служба SQL-сервера, недоступна под учетными данными, которые выполняет запрос. Попробуйте установить безопасность этой временной папки с минимальными ограничениями. DSN, который создается каждый раз при запуске запроса openrowset, может быть воссоздан без конфликта учетных данных. Это сработало для меня без каких-либо требований перезагрузки.
В итоге мы перезапустили сервер базы данных, и это, похоже, решило проблему. Может быть, файлы были заблокированы как-то. Мы никогда не узнаем наверняка, хотя
Мне пришлось скачать и установить "Распространяемый Microsoft Access Database Engine 2010", доступный здесь.
"Причина этой проблемы заключается в том, что на вашем 64-битном Windows Server 2003 не установлен 64-битный текстовый драйвер ODBC. 64-битный MSDASQL просто обеспечивает OLEDB/ODBC" мост ", который позволяет приложениям, построенным на OLEDB и ADO (который использует OLEDB внутри) для доступа к источникам данных через драйверы ODBC." Источник
/* 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
----------------------------------------------------------------------------------------------------------
Эта проблема случилась и со мной. Сочетание включения опции поставщика "Разрешить inprocess" для обеспечения OraOLEDB.Oracle (SSMS > Объекты сервера> Связанные серверы> Обеспечивает> OraOLEDB.Oracle), перезапуска службы Windows SQL Server и, наконец, настройки разрешений для файла TNSNAMES.ora непосредственно.
Я думаю, вы сделали ODBC, используя 32-битный драйвер, но для SQL Server Management Studio требуется 64-битный. Потому что это произошло, когда вы хотите создать связанный сервер для MYSQL на SQL Server. Итак, вы должны использовать систему DSN для 64-битных драйверов.
Другой вариант — добавить имя входа в SQL Server, использующее проверку подлинности SQL Server, и войти в систему с использованием этой учетной записи. Вам нужно будет перейти в раздел «Безопасность» в свойствах экземпляра сервера и выбрать режим проверки подлинности SQL Server и Windows, а также, возможно, потребуется убедиться, что этому пользователю назначены необходимые роли.