2011-08-19

遭遇錯誤: Msg 7308、Msg 7320、Msg 7415(訊息 7302、訊息 7308、訊息 7415);以使用 OPENROWSET 與 OPENDATASOURCE 函數為例

使用版本:
SQL Server 2008 x64
SQL Server 2008 R2 x64

x64 位元的 SQL Server 2008 版本上,若要存取 Excel 或是 Access 的資料,這可能會遭到問題,因為:
Microsoft.Jet.OLEDB.4.0 目前沒有 x64 位元版本。

變通的作法是:
在 x64 位元作業系統 + SQL Server 2008 x64 位元,可以安裝 x64 位元版本的 「Microsoft Access Database Engine 2010 可轉散發套件」。

在安裝 x64 位元版本的 「Microsoft Access Database Engine 2010 可轉散發套件」後,執行 OPENROWSET 與 OPENDATASOURCE 函數時,就可以利用此驅動程式來連線以下的檔案類型,例如:
(1) Excel 的:*.xls、*.xlsx。
(2) Access 的:*.mdb、*.accdb。


根據測試,若環境是:
在 x64 位元作業系統+ SQL Server 2008 x64 位元上,安裝 32 位元版本的 「Microsoft Access Database Engine 2010 可轉散發套件」。

執行 OPENROWSET 與 OPENDATASOURCE 函數上,仍是無法正常使用。



以下為在 x64 位元作業系統+ SQL Server 2008 x64 位元,但並未安裝 x64 位元版本的 「Microsoft Access Database Engine 2010 可轉散發套件」環境上。

使用 OPENROWSET 與 OPENDATASOURCE 函數所遭遇的錯誤訊息:

--01 在 SQL Server 2008 x64 位元上,使用 Microsoft.Jet.OLEDB.4.0 驅動程式

--EX1. 使用 Microsoft OLE DB Provider for Jet
SELECT *
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','C:\myAdmin\OtherSource\北風貿易01.mdb';'admin';'',客戶);
GO

/* 錯誤訊息
訊息 7308,層級 16,狀態 1,行 1
OLE DB 提供者 'Microsoft.Jet.OLEDB.4.0' 不能用來散佈查詢,因為提供者是設定成以單一執行緒 Apartment 模式執行。

Msg 7308,Level 16,State 1,Line 2
OLE DB provider 'Microsoft.Jet.OLEDB.4.0' cannot be used for distributed queries because the provider is configured to run in single-threaded apartment mode.
*/



--02 與 03 在 SQL Server 2008 x64 位元上,尚未安裝 x64 位元版本的 「Microsoft Access Database Engine 2010 可轉散發套件」。

--EX2. 使用 Microsoft.ACE.OLEDB.12.0,連接到 *.accdb
SELECT *
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','C:\myAdmin\OtherSource\NW2010tw.accdb';'admin';'',客戶);
GO

/* 錯誤訊息
沒有安裝 x64 位元版本時的錯誤:

訊息 7302,層級 16,狀態 1,行 1
無法建立連結伺服器 "(null)" 的 OLE DB 提供者 "Microsoft.ACE.OLEDB.12.0" 的執行個體。

Msg 7302,Level 16,State 1,Line 1
Cannot create an instance of OLE DB provider Microsoft.ACE.OLEDB.12.0 for linked server (null).

Msg 7415,Level 16,State 1,Line 2
Ad hoc access to OLE DB provider 'Microsoft.ACE.OLEDB.12.0' has been denied. You must access this provider through a linked server.
*/





雖然已經安裝了 32 位元版本的 「Microsoft Access Database Engine 2010 可轉散發套件」,但仍是無法使用。

也就是說:
(1) 32 位元版本的 SQL Server 是對應到 32 位元版本的驅動程式。
(2) x64 位元版本的 SQL Server 是對應到 x64 位元版本的驅動程式。




在 x64 位元作業系統 + SQL Server 2008 x64 位元,可以安裝 x64 位元版本的 「Microsoft Access Database Engine 2010 可轉散發套件」。
請到以下的網址下載:

Microsoft Access Database Engine 2010 可轉散發套件
http://www.microsoft.com/downloads/details.aspx?FamilyID=C06B8369-60DD-4B64-A44B-84B371EDE16D&displayLang=zh-tw

--04 下載Access Database Engine 2010 可轉散發套件



參考資料

認識 OPENROWSET 與 OPENDATASOURCE 函數;以 SQL Server 2008 R2 x64 位元平台為例
http://sharedderrick.blogspot.com/2011/08/openrowset-opendatasource-sql-server.html

啟用 Ad Hoc Distributed Queries。訊息 15281,SQL Server 已封鎖元件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource' 之存取,因為此元件已經由此伺服器的安全性組態關閉。
http://sharedderrick.blogspot.com/2011/02/sql-server-2008-surface-area.html

Microsoft Access Database Engine 2010 可轉散發套件
http://www.microsoft.com/downloads/details.aspx?FamilyID=C06B8369-60DD-4B64-A44B-84B371EDE16D&displayLang=zh-tw

沒有留言:

張貼留言