搜尋本站文章

2011-08-21

認識「傳遞查詢 (Pass-Through Queries)」,使用 OPENROWSET 與 OPENQUERY 函數

「傳遞查詢 (Pass-Through Queries)」

SQL Server 可將傳遞查詢作為 OLE DB 資料來源未解譯的查詢字串。

查詢必須採用 OLE DB 資料來源可接受的語法。
Transact-SQL 陳述式可使用傳遞查詢的結果,就好像它是一般的資料表參考一樣。

下列是從 OLE DB 提供者產生資料列集的方法:
1. 參考提供者可公開成表格化資料列集之資料來源內的物件。所有的提供者都支援此功能。

2. 將提供者所能處理的指令傳給提供者,並將指令的結果公開成資料列集。此功能要求提供者支援 OLE DB Command 物件,以及它所有的強制介面。

當提供者支援 Command 物件時,這些 Transact-SQL 函數可用來傳送提供者命令,稱為傳遞查詢:
1. OPENQUERY 可將命令字串傳送給使用連結伺服器名稱的 OLE DB 資料來源。
2. OPENROWSET 可支援將指令字串傳送給 OLE DB 資料來源。您可使用特定名稱來參考產生的資料列集。

OPENROWSET 與 OPENQUERY 支援傳遞查詢,只有當查詢具備下列其中一項特性時,查詢字串才會包含預存程序呼叫:
1. 執行單一靜態 SELECT 陳述式。

2. 不使用任何動態的 EXECUTE 陳述式。

3. 不執行任何資料修改作業。



使用 OPENQUERY 函數,請參考以下的範例程式碼:

--EX1. OPENQUERY 搭配 *.accdb:執行 SELECT 傳遞查詢
SELECT *
FROM OPENQUERY([Access_NW2010tw], 'SELECT * FROM 產品資料') 


--EX2. OPENQUERY 搭配 *.accdb:執行 SELECT 傳遞查詢
-- 產品別銷貨季報表
SELECT *
FROM OPENQUERY([Access_NW2010tw], 
'TRANSFORM Sum(CCur([訂貨明細].[單價]*[數量]*(1-[折扣])/100)*100) AS ProductAmount
SELECT 產品資料.產品, 訂貨主檔.客戶編號, Year([訂單日期]) AS 訂貨年份
FROM 產品資料 INNER JOIN (訂貨主檔 INNER JOIN 訂貨明細 ON 訂貨主檔.訂單號碼 = 訂貨明細.訂單號碼) ON 產品資料.產品編號 = 訂貨明細.產品編號
WHERE (((訂貨主檔.訂單日期) Between #1/1/1997# And #12/31/1997#))
GROUP BY 產品資料.產品, 訂貨主檔.客戶編號, Year([訂單日期])
PIVOT "Qtr " & DatePart("q",[訂單日期],1,0) In ("Qtr 1","Qtr 2","Qtr 3","Qtr 4");') 




認識 OPENQUERY (Transact-SQL)

在指定的連結伺服器上,執行指定的傳遞查詢。
這部伺服器是 OLE DB 資料來源。

您可以依照資料表名稱的相同方式,在查詢的 FROM 子句中參考 OPENQUERY。
OPENQUERY 也可以被當作 INSERT、UPDATE 或 DELETE 陳述式的目標資料表加以參考。

它是根據 OLE DB 提供者的功能而定。
雖然查詢可以傳回多個結果集,但 OPENQUERY 只傳回第一個結果集。

權限
任何使用者都可以執行 OPENQUERY。
您可以從定義給連結伺服器的設定,取得用來連接到遠端伺服器的權限。



使用傳遞查詢做為資料表
http://msdn.microsoft.com/zh-tw/library/ms190448.aspx

OPENQUERY (Transact-SQL)
http://technet.microsoft.com/zh-tw/library/ms188427.aspx

以 SQL Server 測試 OLE DB 提供者
http://msdn.microsoft.com/zh-tw/library/ms187072.aspx

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

遭遇錯誤: Msg 7308、Msg 7320、Msg 7415(訊息 7302、訊息 7308、訊息 7415);以使用 OPENROWSET 與 OPENDATASOURCE 函數為例
http://sharedderrick.blogspot.com/2011/08/msg-7308msg-7320msg-7415-7302-7308-7415.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 可轉散發套件」驅動程式;Microsoft Access Database Engine 2010 Redistributable
http://sharedderrick.blogspot.com/2011/08/microsoft-access-database-engine-2010.html

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