對給定的鏈接服務器執行指定的傳遞查詢。該服務器是 OLE DB 數據源。OPENQUERY 可以在查詢的 FROM 子句中引用,就好象它是一個表名。OPENQUERY 也可以作為 INSERT、UPDATE 或 DELETE 語句的目標表進行引用。但這要取決於 OLE DB 訪問接口的功能。盡管查詢可能返回多個結果集,但是 OPENQUERY 只返回第一個。
Transact-SQL 語法約定
語法
OPENQUERY ( linked_server ,'query' )
參數
http://ddue.schemas.microsoft.com/authoring/2003/5 NS = "http://ddue.schemas.microsoft.com/authoring/2003/5"
- linked_server
-
表示鏈接服務器名稱的標識符。
- ' query '
-
在鏈接服務器中執行的查詢字符串。該字符串的最大長度為 8 KB。
備注
OPENQUERY 不接受其參數的變量。
在 SQL Server 2000 和更高版本中,OPENQUERY 不能用於對鏈接服務器執行擴展存儲過程。但是,通過使用四部分名稱,可以在鏈接服務器上執行擴展存儲過程。例如:
EXEC SeattleSales.master.dbo.xp_msver
權限
任何用戶都可以執行 OPENQUERY。用於連接到遠程服務器的權限是從為鏈接服務器定義的設置中獲取的。
示例
A. 執行 SELECT 傳遞查詢
以下示例將使用“用於 Oracle 的 Microsoft 訪問接口”針對 Oracle 數據庫創建一個名為 OracleSvr
的鏈接服務器。然后,該示例針對此鏈接服務器使用 SELECT
傳遞查詢。
注意:
本示例假定已經創建了一個名為 ORCLDB
的 Oracle 數據庫別名。
EXEC sp_addlinkedserver 'OracleSvr', 'Oracle 7.3', 'MSDAORA', 'ORCLDB' GO SELECT * FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles') GO
B. 執行 UPDATE 傳遞查詢
以下示例針對示例 A 中創建的鏈接服務器使用 UPDATE
傳遞查詢。
UPDATE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE id = 101') SET name = 'ADifferentName';
注意:OPENQUERY 不接受參數變量,也就是說:DELETE OPENQUERY (linked_server, 'SELECT id FROM msgs
WHERE id=' + @id); 是不正確的,但可以這樣做:DELETE OPENQUERY (linked_server, 'SELECT id FROM
msgs') WHERE id=@id); 。
C. 執行 INSERT 傳遞查詢
以下示例針對示例 A 中創建的鏈接服務器使用 INSERT
傳遞查詢。
INSERT OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles') VALUES ('NewTitle');
D. 執行 DELETE 傳遞查詢
以下示例使用 DELETE
傳遞查詢刪除示例 C 中插入的行。
DELETE OPENQUERY (OracleSvr, 'SELECT name FROM joe.titles WHERE name = ''NewTitle''');
原文鏈接:http://www.cnblogs.com/aji88/archive/2009/11/06/1597263.html