2009-09-01 12 views
10

Có vấn đề thú vị. Tôi đang đọc từ một tập tin excel trên một máy chủ thông qua một OpenRowset trong Sql2005. Tôi đã chạy truy vấn một số lần mà không có bất kỳ vấn đề gì. Tôi vừa ra ngoài cho một cuộc họp nhanh và đột nhiên tôi nhận được lỗi "Không thể khởi tạo đối tượng nguồn dữ liệu của nhà cung cấp OLE DB" MSDASQL "cho máy chủ được liên kết" (null) ""Không thể khởi tạo đối tượng nguồn dữ liệu của nhà cung cấp OLE DB "MSDASQL" cho máy chủ được liên kết "(null)"

Tôi đã đảm bảo tệp không được sử dụng trên máy chủ và thậm chí xóa chúng và recopied chúng trên máy chủ và vẫn còn tôi nhận được cùng một lỗi.

CẬP NHẬT: Điều này dường như chỉ xảy ra nếu tôi tham gia hai lựa chọn từ các trình mở khác nhau. Nếu tôi chạy các truy vấn riêng lẻ thì chúng vẫn hoạt động tốt. Tôi đã thực hiện việc tham gia trước đó mà không có bất kỳ vấn đề gì. Ý tưởng?

Trả lời

18

Sự cố xảy ra do thư mục Nhiệt độ của Người dùng mà dịch vụ máy chủ SQL đang chạy không thể truy cập trong thông tin xác thực mà truy vấn đang chạy. Cố gắng thiết lập bảo mật của thư mục tạm thời này với các hạn chế tối thiểu. Các dsn được tạo ra mỗi khi bạn chạy một truy vấn openrowset sau đó có thể được tái tạo mà không có bất kỳ xung đột ủy nhiệm. Điều này làm việc cho tôi mà không cần bất kỳ yêu cầu khởi động lại nào.

+2

Tôi sẽ tìm thư mục Temp này ở đâu? – Slider345

+3

Đối với cấu hình cụ thể của chúng tôi - Windows Server 2008 R2, SQL Server 2008 R2 - thư mục TEMP cụ thể mà chúng tôi cần chia sẻ với người dùng miền là: 'C: \ Users \ \ AppData \ Local \ Temp' – fresh

+1

Tôi đã dành cả ngày cho việc này - tôi không thể tin đây là giải pháp !!! Nhưng nó làm việc nên tôi hạnh phúc. – Warren

5

Chúng tôi đã kết thúc khởi động lại máy chủ cơ sở dữ liệu và dường như giải quyết được sự cố. Có lẽ các tập tin đã bị khóa bằng cách nào đó. Chúng tôi sẽ không bao giờ biết chắc chắn mặc dù

+0

Khởi động lại máy chủ cũng đã hoạt động đối với tôi. Đã kết thúc việc tạo/thả máy chủ được liên kết với kịch bản trong thủ tục được lưu trữ thực hiện đầu vào. – ajeh

+0

Khởi động lại máy chủ hoạt động cho tôi như là sự quyến rũ. cảm ơn bạn tôi không thể tin rằng tôi dành bao nhiêu thời gian để giải quyết vấn đề này. cảm ơn bạn –

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

Tôi phải tải xuống và cài đặt "Microsoft Access Database Engine 2010 Redistributable" có sẵn here.

"Nguyên nhân của vấn đề này là không có trình điều khiển văn bản ODBC 64 bit được cài đặt trên máy chủ Windows 64 bit của bạn 2003 thực sự. MSDASQL 64 bit chỉ cung cấp cầu nối OLEDB/ODBC 'cho phép các ứng dụng được xây dựng trên OLEDB và ADO (sử dụng OLEDB trong nội bộ) để truy cập nguồn dữ liệu thông qua trình điều khiển ODBC. " Source

0

Sự cố này cũng xảy ra với tôi. Sự kết hợp cho phép tùy chọn nhà cung cấp "Cho phép inprocess" cho OraOLEDB.Oracle cung cấp (SSMS> Đối tượng Máy chủ> Máy chủ Liên kết> Cung cấp> OraOLEDB.Oracle), khởi động lại dịch vụ Windows Server Windows và cuối cùng điều chỉnh các quyền trên tệp TNSNAMES.ora trực tiếp.