Contents ...
udn網路城邦
利用 OpenRowset、OpenDataSource 查詢EXCEL
2017/05/09 14:52
瀏覽732
迴響0
推薦0
引用0
**伺服器代管推薦文**
拒絕存取。

訊息 7399,層級 16,狀況 1,行 1
保持伺服器 "(null)" 的 OLE DB 供應者 "Microsoft.ACE.OLEDB.12.0" 呈報了錯誤。
訊息 7350,層級 16,狀況 2,行 1
無法從保持伺服器 "(null)" 的 OLE DB 提供者 "Microsoft.ACE.OLEDB.12.0" 獲得資料行資訊。


(註3)若履行的情況沒有安裝OFFICE 軟體,天然就不會有Microsoft.ACE.OLEDB.12.0連線物件。睜開物件總館中LinkServers資料夾底下的Providers也可觀測此SQL Server是否供給ACE毗鄰物件。以下圖所示的SQL Server環境中履行。

可依需求選擇安裝32位元或是64位元。

因此需要自行下載Microsoft Access Database Engine 2010 可轉披發套件

image

http://sanchen.blogspot.tw/2007/08/imex1-oledb-excel-null.html

 

  利用T-SQL查詢excel檔案中的資料是最省時省力的,履行前須肯定SQL Server是否答應使用 OPENROWSET 和 OPENDATASOURCE 進行特定渙散式查詢(參考註1)。由於需投過SQL Server讀取excel檔案中的資料,是以SQL Server執行帳號需要具有存取該檔案的權限,可參考(註2)申明調劑SQL Server啟動帳號。

資料夾權限

SELECT * FROM OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel 12.0;HDR=Yes;IMEX=1;Database=c:\temp\Employee.xls', 'SELECT * FROM [工作表1$]')

增補                                                                                      

我的履行情況以下
作業系統:Windows 7 (64位元)
履行情況 :SQL Server 2008 R2 (64位元)+Office (64位元)

以下利用 ACE 引擎查詢 Excel 97-2003 檔案內容(註1),由於履行語法的那台SQL Server情況中已安裝了OFFICE 64位元,是以在下圖可看到Microsoft.ACE.OLEDB.12.0毗鄰。值得一提的是,Microsoft.ACE.OLEDB.12.0 可以查詢正在開啟的 Excel 文件,而 Microsoft.Jet.OLEDB.4.0 則不可。

ACE 引擎是随 Office 2007 一起發布的資料庫連接组件,可同時查詢舊有的Office 97-2003與Office 2007。

執行成績將泛起以下毛病訊息。
Msg 7403, Level 16, State 1, Line 2
The OLE DB provider "Microsoft.ACE.OLEDB.12.0" has not been registered.

參考:sharedderrick
利用.net程式獲得excle資料可參考這裡

(註2)記得確認 SQL Server伺服器的啟動帳號帳號,擁有開啟excel檔案的權限

若要能夠讓t-sql 指令碼直接讀取c:\temp 路徑內的 檔案,請開啟資料夾的內容並確認平安性是否有受與讀取、寫入..等權限

--利用OpenRowSet
SELECT * FROM OpenRowSet('Microsoft.ACE.OLEDB.12.0', 
'Excel 12.0;HDR=Yes;IMEX=1;Database=c:\temp\Employee.xlsx', 'select * from [工作表1$]')   
SELECT * FROM OpenRowSet('Microsoft.ACE.OLEDB.12.0', 
'Excel 12.0;HDR=Yes;IMEX=1;Database=c:\temp\Employee.xlsx', [工作表1$])   

--利用OpenDataSource
SELECT * FROM OpenDataSource('Microsoft.ACE.OLEDB.12.0', 
'Excel 12.0;HDR=Yes;IMEX=1;Database=c:\temp\Employee.xlsx')...[工作表1$]   
SELECT * FROM OpenDataSource('Microsoft.ACE.OLEDB.12.0', 'Data Source=c:\temp\Employee.xlsx;
Extended Properties="Excel 12.0;HDR=Yes;IMEX=1"')...[工作表1$]  

 

--利用OpenRowSet
SELECT * FROM OpenRowSet('Microsoft.Jet.OLEDB.4.0', 
'Excel 8.0;HDR=Yes;IMEX=1;Database=c:\temp\Employee.xls', 
'SELECT * FROM  [工作表1$]')  

SELECT * FROM OpenRowSet('Microsoft.Jet.OLEDB.4.0', 
'Excel 8.0;HDR=Yes;IMEX=1;Database=c:\temp\Employee.xls', [工作表1$])   

--使用OpenDataSource
SELECT * FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0', 
'Excel 8.0;HDR=Yes;IMEX=1;Database=c:\temp\Employee.xls')...[工作表1$]   

SELECT * FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0', 
'Data Source=c:\temp\Employee.xls;Extended Properties="Excel 8.0
;HDR=Yes;IMEX=1"')...[工作表1$] 

 

利用OpenDataSource基本語法:OPENDATASOURCE ( provider_name, init_string )
OPENDATASOURCE 可做為四部分名稱的第一部份使用,來參考 SELECT、INSERT、UPDATE 或 DELETE 陳說式中的資料表或檢視名稱,或參考 EXECUTE 陳述式中的遠端預存法式。

不然執行時會呈現以下毛病訊息

創立excel檔案,在檔案內容成立以下資料。接著利用不同的

當伺服器情況是32位元,也可使用Microsoft.Jet.OLEDB.4.0保持Excle檔案存取資料。若是你的環境是SQL Server 2008 R2 x64 版本,則會有以下毛病訊息。這是因為今朝Microsoft.Jet.OLEDB.4.0 沒有 x64 位元版本,產生的毛病:訊息 7308,層級 16,狀態 1,行 1
OLE DB 提供者 'Microsoft.Jet.OLEDB.4.0' 不克不及用來散佈查詢,因為供給者是設定成以單一執行緒 Apartment 模式履行。

image

經過Microsoft.ACE.OLEDB.12.0毗鄰可獲得以下檔案類型
          Excel:*.xls、*.xlsx。
          Access:*.mdb、*.accdb。

 

訊息 15281,層級 16,狀態 1,行 1
SQL Server 已封閉元件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource' 之存取,因為此元件已經由此伺服器的平安性組態封閉。系統經管員可使用 sp_configure 來啟用 'Ad Hoc Distributed Queries' 的利用。如需有關啟用 'Ad Hoc Distributed Queries' 的具體資訊,請參閱《SQL Server 線上叢書》中的<介面區組態>(Surface Area Configuration)。

以筆者的SQL Server Configuration Manager 為例 ,SQL Server啟動帳號為  .\Sndy 
image

EXEC sp_configure 'show advanced options','1'
RECONFIGURE 
EXEC sp_configure 'Ad Hoc Distributed Queries',1
RECONFIGURE 

 

環境 : SQL Server 2008 R2 (32位元)
功課系統 XP (32位元)

--利用OpenRowSet
SELECT * FROM OpenRowSet('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=Yes;IMEX=1;Database=c:\temp\Employee.xls',
'SELECT * FROM [工作表1$]')

SELECT * FROM OpenRowSet('Microsoft.ACE.OLEDB.12.0',
'Excel 12.0;HDR=Yes;IMEX=2;Database=c:\temp\Employee.xls',[工作表1$])


IMEX=1 默示欄位中數字與文字夾雜時,強迫解譯為本文。(參考這裡)
當HDR=Yes,默示 Excel 表的第一行為資料行名稱,應疏忽第一行資料。

使用OpenRowSet的語法以下。

--利用OpenDataSource
SELECT * FROM OpenDataSource('Microsoft.ACE.OLEDB.12.0', 
'Excel 12.0;HDR=Yes;IMEX=1;Database=c:\temp\Employee.xls')...[工作表1$]

SELECT * FROM OpenDataSource('Microsoft.ACE.OLEDB.12.0', 
'Data Source=c:\temp\Employee.xls;
Extended Properties="Excel 12.0;HDR=Yes;IMEX=1"')...[工作表1$]

查 尋後果以下

 

(註1)SQL Server預設不答應利用 OPENROWSET 和 OPENDATASOURCE 進行特定渙散式查詢。利用 OpenRowSet前,需使用sp_configure 來啟用 'Ad Hoc Distributed Queries'

image

image

若履行的伺服器沒有安裝Office 64位元版,可自行下載安裝 64位元版本的 Microsoft Access Database Engine 2010是以使用OPENROWSET 與 OPENDATASOURCE 函數查詢Excle資料時,可改為Microsoft.ACE.OLEDB.12.0。

由於Microsoft.Jet.OLEDB.4.0 目前沒有 x64 位元版本。

Jet 引擎人人都很熟習,可以查詢 Office 97-2003,但不能查詢 Office 2007。

以下內文出自: http://mydiamond.pixnet.net/blog/post/47090608-%E4%BD%BF%E7%94%A8-openrowset%E3%80%81opendatasource-IT委外|MIS外包|資訊委外|主機代管|伺服器代管|虛擬主機|郵件代管|郵件託管|雲端方案|雲端主機|網站代管|網站託管


限會員,要發表迴響,請先登入