2013-12-16 37 views
3

我試圖運行下面的語句:使用SQL憑據打開一個文件OPENROWSET

INSERT INTO table SELECT * FROM 
OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
'Excel 12.0; 
Database=//server/folder/file.xls; 
HDR=YES;', 
'SELECT * FROM [Sheet1$]') 

不過,我收到了以下錯誤:

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "The Microsoft Access database engine cannot open or write to the file '\\server\folder\file.xls'. It is already opened exclusively by another user, or you need permission to view and write its data.". 

Msg 7303, Level 16, State 1, Line 1 
Cannot initialize the data source object of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)". 

我運行SQL Server 2005在一臺32位機器上。正在執行的代碼最終將來自IIS6 Web服務器上的c#代碼。但是,目前我只是試圖讓它在SQL Server上運行。我使用SQL身份驗證登錄到SQL Server,但必須使用特定於共享驅動器(我們網絡上的AD帳戶)的Windows Auth來訪問該文件。 Ad-Hoc特權已授予SQL驗證帳戶,以允許OPENROWSET

我已經嘗試添加UID=user;PASS=pswd成如下面的OPENROWSET代碼:

INSERT INTO table SELECT * FROM 
    OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0; 
    Database=//server/folder/file.xls; 
    HDR=YES; 
UID=user; 
PASS=pswd', 
    'SELECT * FROM [Sheet1$]') 

這產生相同的錯誤。我還使用用戶標識設置了SQL CREDENTIAL,並通過了可以訪問該共享驅動器的windows auth Active Directory帳戶,但錯誤依然存在。

我考慮過使用代理,但這不是一個sql server代理作業。這是一個特別的電話。

我也使用Windows身份驗證與具有共享權限的用戶登錄到SQL Server,並獲得相同的錯誤。

我已經研究了很多,但似乎無法找到有效的答案。通過我的搜索,這似乎是許多人遇到的問題。任何幫助將不勝感激。我很難過。

+0

請提供有關服務器操作系統的信息。它是32位還是64位體系結構?你有沒有安裝適當的OleDb驅動程序?你在哪裏試圖執行上面的查詢:在本地計算機上的服務器端? –

+0

@MaciejLos這是一個32位體系結構。如上所述,OleDb可以正常工作而不使用共享驅動器,所以我知道這些驅動程序工作正常。同樣在上面提到的,我最終將從在Web服務器上作爲CodeBehind運行的C#代碼執行。然而,現在,我只需要在運行使用SQL Server身份驗證登錄的常規SQL adhoc查詢時工作。我正在運行管理工作室來運行查詢。 – steventnorris

+0

[MSDN寫道:](http://technet.microsoft.com/en-us/library/ms175915.aspx)使用BULK INSERT或INSERT ... SELECT * FROM OPENROWSET(BULK ...)批量導入數據來自另一臺計算機的數據文件必須在兩臺計算機之間共享。要指定共享數據文件,請使用通用命名約定(UNC)名稱,該名稱採用通用格式\\ Servername \ Sharename \ Path \ Filename。此外,**用於訪問數據文件的帳戶必須具有讀取遠程磁盤**上的文件所需的權限。 –

回答

1

我很確定,當您使用OpenRowSet時,它是需要訪問該文件的SQL Server的服務用戶。

而且由於您似乎試圖訪問另一臺服務器上的文件,因此如果SQL Server以本地系統或其他本地用戶帳戶運行,則可能會遇到問題。

我有幾次通過更改SQL服務器作爲AD用戶運行(具有安全含義),然後授予該用戶訪問網絡上的文件或將外部文件(在這種情況下的Excel)與SQL服務器在同一臺計算機上。

+0

我沒有能力將文件移動到SQL Server,但它可以正常工作,如果它在那裏。你是對的,訪問另一臺服務器是這裏的問題。我試圖不以AD用戶身份登錄,但如果沒有其他方式,我可能必須走這條路線。證書是否影響openrowset?本網站http://www.jasonstrate.com/2013/07/security-questions-logins-credentials-and-proxies/似乎表明可以使用憑據訪問其他服務器上的文件。 – steventnorris

+0

如果兩臺計算機位於同一個域中,則可以授予SQL Server計算機訪問//服務器/文件夾共享本地系統帳戶(或SQL Server運行的任何帳戶)的權限。 –

+0

如何確定SQL Server在哪個帳戶上運行? – steventnorris