我怎样处理EXEC(sql)AT LinkedServer的结果?

时间:2016-08-04 11:45:24

标签: sql-server

我正在使用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命令的结果,而不需要先将它插入表中?

3 个答案:

答案 0 :(得分:1)

我知道,没有办法直接加入Exec。在我看来,插入临时表是你最好的选择。即使你直接加入语法也会发生同样的事情,SQL Server需要将远程数据拉到本地,然后执行连接。

另一种选择可能是传递一个表参数并具有该输出。你可以使用sp_executesql。

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

答案 1 :(得分:0)

我会每隔5分钟左右使用sql代理等本地同步该表。然后我加入到本地表。

根据我的经验,使用链接服务器查询远程表永远不会给我最好的查询计划。如果可以,我会避免这样做。

答案 2 :(得分:0)

在使用它们之前,在本地缓存远程结果没有任何问题。平均而言,这种方法可以提供最佳性能。

此外,您可以尝试静态查询:

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

如果它不会马上工作,至少你可以试试REMOTE join提示。当然,通常它应该是最后的手段(暗示,我的意思)。