2016-08-04 9 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はリモートデータをローカルにプルしてからジョインを実行する必要があります。

もう1つのオプションは、テーブルパラメータを渡して、その出力を持つことです。あなたはsp_executesqlでそれを行うことができます。

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

0

私は5分ごとかそこらSQLエージェントのようなものを使用してローカルでそのテーブルを同期します。それから私はそのローカルテーブルへの結合を行います。

私の経験では、リンクサーバーを使用してリモートテーブルをクエリすると、利用可能な最適なクエリプランが決して得られません。もしできれば、私はそれを避けるだろう。

0

リモート結果を使用する前に、リモート結果をローカルにキャッシュする際に問題はありません。平均して、このアプローチは最高のパフォーマンスを提供します。それはすぐに動作しない場合は、少なくともあなたはREMOTE結合ヒントを試すことができ、

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

また、あなたは、静的なクエリを試すことができます。もちろん、通常は最後の手段(ヒント、私は意味する)でなければなりません。

関連する問題