以文本方式查看主題 - 昂捷論壇 (http://www.26035.net/bbs/index.asp) -- □-技術研討會 (http://www.26035.net/bbs/list.asp?boardid=36) ---- 如何將變量傳遞給鏈接的服務器查詢 (http://www.26035.net/bbs/dispbbs.asp?boardid=36&id=6831) |
-- 作者:czg1981 -- 發(fā)布時間:2010/1/28 16:12:36 -- 如何將變量傳遞給鏈接的服務器查詢 數(shù)據(jù)庫之間通過鏈接服務器訪問另一臺服務有兩種方法,一種是我們常用的使用四部分名稱,另外一種就是用行集函數(shù)代入?yún)?shù)法。 四部分名稱法就是用 “鏈接服務器.數(shù)據(jù)庫名.用戶名.表名”的形式,這個如何加參數(shù)我們就不介紹了。 行集函數(shù)指的是:OPENQUERY、OPENROWSET、OPENXML、OPENDATASOURCE等,我們通過看語法就知道這類函數(shù)不能帶入變量。行集函數(shù)是直接將寫好的語句在服務器上執(zhí)行,然后再把返回結(jié)果顯示出來,因此它的效率要比四部分名稱法要快,如果說在傳語句中再加上條件,那這個差別就更快了,這個在遠程服務器非Server SQL 更明顯。我們這邊做了一個測試,本地是SQL 2008,遠程服務器是Oracle 9i,在一個近200W行的表中,顯示id=10000的一行記錄,用四部分名稱平均用時超過54秒,用OPENQUERY不到1S就完成。 1 傳遞基本值 在基本的 TRANSACT-SQL 語句已知,但必須在一個或多個特定的值傳遞時使用類似于下面的示例代碼 DECLARE @TSQL varchar(8000), @VAR char(2) 您必須傳遞整個 TRANSACT-SQL 查詢或鏈接的服務器 (或兩者),名稱中使用的代碼類似于下面的示例: DECLARE @OPENQUERY nvarchar(4000), @TSQL nvarchar(4000), @LinkedServer nvarchar(4000) 例子截選自:http://support.microsoft.com/kb/314520/zh-cn |
-- 作者:czg1981 -- 發(fā)布時間:2010/1/29 20:46:58 -- 用 EXEC (\'……\') AT linkedserver 訪問遠程服務器。 在上面介紹的OPENQUERY當只使用 select 的時候,確實解決我的問題,后來使用update 時,確又出問題了,報“無法使用書簽從鏈接服務器的OLE DB 訪問接口 "OraOLEDB.Oracle"提取行”,后來查詢沒有什么好的解決方案,只能放棄! 后來在同事的幫助下,找到 用EXEC (\'……\') AT linkedserver的方式,后來發(fā)行這個比OPENQUERY好用,關鍵是可以直接帶入?yún)?shù)。 1 select、update、insert --動態(tài)SQL在Oracle鏈接服務器上執(zhí)行 2帶參賽的 declare @deposit int,@psword varchar(20),@cardno varchar(20) set @deposit =1 set @psword=\'111111\' set @cardno=\'111111\' EXEC(\'update table_name set column_name1=\'+@deposit+\',column_name2=\'+@psword+\' where column_name3=\'\'\'+@cardno+\'\'\'\') AT R2000 3調(diào)研存儲過程 --執(zhí)行Oracle上存儲過程 |