2009-09-01 79 views
10

Tiene un problema interesante. Estoy leyendo de un archivo de Excel en un servidor a través de un OpenRowset en Sql2005. He ejecutado la consulta varias veces sin ningún problema. Acabo de salir para una reunión rápida y de repente me aparece el error "No se puede inicializar el objeto fuente de datos del proveedor OLE DB" MSDASQL "para el servidor vinculado" (nulo) ""No se puede inicializar el objeto de origen de datos del proveedor OLE DB "MSDASQL" para el servidor vinculado "(nulo)"

Me he asegurado de que los archivos no están en uso en el servidor e incluso los borraron y los volvieron a copiar en el servidor y todavía recibo el mismo error.

ACTUALIZACIÓN: Esto solo parece suceder si uniera dos selecciones de diferentes openrowsets. Si ejecuto las consultas de forma individual, aún funcionan bien. He hecho la unión antes sin ningún problema. Ideas?

Respuesta

18

El problema se debe a que no se puede acceder a la carpeta Temp del usuario bajo el cual se ejecuta el servicio SQL Server con las credenciales que ejecuta la consulta. Intente establecer la seguridad de esta carpeta temporal con restricciones mínimas. El dsn que se crea cada vez que ejecuta una consulta de apertura abierta se puede volver a crear sin conflictos de credenciales. Esto funcionó para mí sin ningún requisito de reinicio.

+2

¿Dónde encontraría esta carpeta Temp? – Slider345

+3

Para nuestra configuración específica - Windows Server 2008 R2, SQL Server 2008 R2 - la carpeta TEMP específica que necesitábamos compartir con los usuarios de dominio era: 'C: \ Users \ \ AppData \ Local \ Temp' – fresh

+1

He pasado todo el día en esto - ¡No puedo creer que esta sea la solución! Pero funcionó, así que estoy feliz. – Warren

5

Terminamos reiniciando el servidor de la base de datos y eso pareció resolver el problema. Tal vez los archivos estaban siendo bloqueados de alguna manera. Sin embargo, nunca lo sabremos con seguridad

+0

El reinicio del servidor funcionó para mí también. Finalizó la creación/caída del servidor vinculado a scripts en el procedimiento almacenado que realiza la entrada. – ajeh

+0

El servidor de reinicio funciona para mí como encanto. gracias, no puedo creer que pase cuánto tiempo para resolver este problema. gracias –

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 
---------------------------------------------------------------------------------------------------------- 
3

tuve que descargar e instalar "Microsoft Access Database Engine 2010 redistribuible" here disponibles.

"La causa de este problema es que no hay un controlador de texto ODBC de 64 bits instalado en su Windows Server 2003 de 64 bits en realidad. El MSDASQL de 64 bits solo proporciona un 'puente' OLEDB/ODBC que permite que las aplicaciones en OLEDB y ADO (que usa OLEDB internamente) para acceder a fuentes de datos a través de controladores ODBC ". Source

0

También me ha pasado este problema. Una combinación de habilitar la opción de proveedor "Permitir en proceso" para OraOLEDB.Oracle proporcionar (SSMS> Objetos del servidor> Servidores vinculados> Proporciona> OraOLEDB.Oracle), reiniciar el servicio SQL Server de Windows y, por último, ajustar los permisos en el archivo TNSNAMES.ora directamente.

Cuestiones relacionadas