星期五, 10月 18, 2013

[SQL] OLE DB 提供者 Microsoft.ACE.OLEDB.12.0 尚未註冊

論壇問題
使用 OPENROWSET() 來抓取 Excel 資料時,出現"OLE DB 提供者 Microsoft.ACE.OLEDB.12.0 尚未註冊" 的錯誤訊息,該如何註冊?

開啟伺服器選項 Ad Hoc Distributed Queries

使用 OPENROWSET 時,必須先開啟伺服器選項 Ad Hoc Distributed Queries 才可以使用,沒有開啟的情況下,會出現下面的錯誤訊息
SQL Server 已封鎖元件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource' 之存取,因為此元件已經由此伺服器的安全性組態關閉。系統管理員可以使用 sp_configure 來啟用 'Ad Hoc Distributed Queries' 的使用。如需有關啟用 'Ad Hoc Distributed Queries' 的詳細資訊,請在《SQL Server 線上叢書》中搜尋 'Ad Hoc Distributed Queries'。
有兩種開啟方式
  • SSMS 內開啟:Instance => 右鍵 Facset => 介面區組態 => AdHocRemoteQueriesEnable 設為 True
[SQL] OLE DB 提供者 Microsoft.ACE.OLEDB.12.0 尚未註冊-3
  • 利用 T-SQL 語法開啟
sp_configure 'show advanced options' , 1
reconfigure
GO 
sp_configure 'Ad Hoc Distributed Queries' , 1 
reconfigure
GO

安裝 Microsoft Access Database Engine 2010 可轉散發套件
執行下述語法,就會得到尚未註冊的錯誤訊息
SELECT * 
FROM OpenRowSet
  (
      'Microsoft.ACE.OLEDB.12.0',
      'Excel 12.0;HDR=Yes;Database=c:\Demo.xlsx',
      'SELECT * FROM [sheet1$]'
  ) 
OLE DB 提供者 "Microsoft.ACE.OLEDB.12.0" 尚未註冊。
從 SSMS 上可以看出[提供者]內根本就沒有 Microsoft.ACE.OLEDB.12.0

[SQL] OLE DB 提供者 Microsoft.ACE.OLEDB.12.0 尚未註冊-1

Microsoft Access Database Engine 2010 可轉散發套件 下載並安裝,就可以在 SSMS 內看見 Microsoft.ACE.OLEDB.12.0

[SQL] OLE DB 提供者 Microsoft.ACE.OLEDB.12.0 尚未註冊-2

再次執行 OPENROWSET T-SQL 語法,就可以把 Excel 資料抓進來囉

[SQL] OLE DB 提供者 Microsoft.ACE.OLEDB.12.0 尚未註冊-4

存取 Access/Excel 的 OLEDB Provider
  • Office2007 之前:Microsoft Jet OLE DB 4.0
  • Office2007 開始:Microsoft Office 12.0 Access Database Engine OLE DB Provider(Microsof ACE.OLEDB.12.0)

沒有留言:

張貼留言