2016-08-04 15 views
0

我正在使用EXEC(sql)AT LinkedServer命令從遠程服務器獲取一些數據。到目前爲止,我能用腳本中的結果做的唯一事情就是將它們插入到本地表中。如何處理EXEC(sql)AT LinkedServer的結果?

CREATE TABLE #MyTable (Col1 VARCHAR(10)) 

INSERT INTO #MyTable 
EXEC ('SELECT Col1 FROM MyDB.dbo.Table1 WHERE Col2 = ?', 'Val2') AT REMOTEDDB 

這很好,我可以使用它。

我想將結果集直接加入到本地表中,就像OPENQUERY一樣,但是我找不到這樣的語法。它可能不被支持。我無法使用OPENQUERY,因爲數據太大,我需要應用運行時參數。

是否有任何其他選項可用於處理和使用EXEC AT命令的結果,而無需先將其插入表中?

回答

1

我知道沒有辦法直接加入Exec。在我看來,插入臨時表是您最好的選擇。即使你直接用語法加入,同樣的事情仍然會發生,SQL Server需要將遠程數據放到本地,然後執行連接。

另一個選擇可能是傳遞一個表參數並獲得該輸出。你可以用sp_executesql來做到這一點。

https://msdn.microsoft.com/en-us/library/ms188001.aspx

0

我會在本地同步該表使用類似SQL代理每5分鐘左右。然後我加入到本地表中。

根據我的經驗,使用鏈接服務器查詢遠程表從未給我提供最佳查詢計劃。如果可以,我會避免這種情況。

0

在使用它們之前在本地緩存遠程結果沒有任何問題。平均而言,這種方法提供了最佳性能。

此外,您還可以嘗試靜態查詢:

select * 
from dbo.LocalTable lt 
    inner join RemoteDB.MyDB.dbo.Table1 rt on lt.Id = rt.Id 
where rt.Col2 = 'Val2'; 

如果它不會馬上工作,至少你可以試試遠程聯接提示。當然,通常它應該是最後的手段(我的意思是提示)。