使用 OPENQUERY 函數進行直接傳遞查詢
可以在 SELECT 語句中用 OPENQUERY 函數的結果代替表名的位置
若 OLE DB 提供程序支持,還可以用 OPENQUERY 函數的結果作為 INSERT、UPDATE 或 DELETE 語句的目標表
直接傳遞查詢示例
SELECT * FROM OPENQUERY (XXXServer, 'SELECT ProductID, Royalty FROM Northwind.dbo.ProductInfo')
二、查詢、新增、更新、刪除
假設在第一步的設置里“鏈接服務器名”里填入的是“TEST”,查詢、寫入、更新及刪除以表tableName為例用如下語句
查詢:SELECT * FROM OPENQUERY(TEST, 'SELECT * FROM tableName')
寫入:INSERT INTO OPENQUERY(TEST, 'SELECT * FROM tableName WHERE 1>1') VALUES(3,6,'ANDY')
更新:UPDATE OPENQUERY(TEST, 'SELECT * FROM tableName') SET role_id = 'ForTest' WHERE id = 3
刪除:DELETE OPENQUERY(TEST, 'SELECT * FROM tableName') WHERE id IN (1,3)
以上語句在查詢分析器里執行通過。
這里最關鍵的是使用SQL的函數OPENQUERY,查詢、寫入、更新及刪除的目標表都用OPENQUERY函數來打開Oracle的表就可以了,有關OPENQUERY函數的說明,SQL Server的幫助文檔里如下:
OPENQUERY
在給定的鏈接服務器(一個 OLE DB 數據源)上執行指定的直接傳遞查詢。可以在查詢的 FROM 子句中像引用表名那樣引用 OPENQUERY 函數。依據 OLE DB 提供程序的能力,還可以將 OPENQUERY 函數引用為 INSERT、UPDATE 或 DELETE 語句的目標表。盡管查詢可能返回多個結果集,但是 OPENQUERY 只返回第一個。
語法
OPENQUERY ( linked_server , 'query' )
參數
linked_server
一個標識符,表示鏈接的服務器的名稱。
'query'
在鏈接的服務器中執行的查詢字符串。
注釋
OPENQUERY 不接受參數變量。
三、OPENQUERY 的日期時間條件式
不建議使用:select * from openquery(linked_server ,'select * from kxx_file ') where kxx07='2009-10-08'
該語句查詢耗時18s;很明顯RETURN的數據相當大,再進行篩選;
建議使用:select * from openquery(linked_server ,'select * from kxx_file where kxx07={ ts ''2009-10-08 00:00:00.000''} ')
該語句查詢耗時3s;在linked_server執行完篩選才RETURN的,TABLE的數據量越大效果越明顯;
以上針對鏈接INFORMIX,測試了許久才發現openquery對字段類型的轉換有失水準!大家使用的時候一定要注意,對字符和數字影響較小!
轉自:http://www.cnblogs.com/godwar/