2012-04-10 8 views
0

私はこれをどのようにフレーズするかについてはあまりよく分かりません。ここに問題があります:T-SQL関数または実行可能な代替の動的openrowset?

私はいくつかのデータを取得するために別のシステム(AS400)に参加する必要がある1-nの項目があります。私はopenrowset、例えば外where基準を指定した場合

openrowsetは永遠に取る:

select * from openrowset('my connection string', 'select code, myfield from myTable') 
where code = @code 

私の考えでは、アイテム数に取り、にそれを注入する動的SQLを使用する関数を作成することでしたopenrowset文字列、ラ:

declare @cmd varchar(1000) 
set @cmd = 'select * from openrowset('my connection string', 
     ''select code, myfield from myTable where code = ' + @code + ''')' 

どうやら私は、関数の内部でinsert.. exec..戦略を使用することはできません。これを達成するためのより良い方法はありますか?私はcross applyを使って外部データを必要とするジョインでこれを使用しようとしていました。

私はtvfcross applyと結婚していませんが、このデータをすばやく取得する方法が必要です。助けてくれてありがとう。

+0

私はこれを行うための唯一の方法は、(あなたが何をし始めていたとして)、動的SQLを使用して既存のテーブルに挿入するストアドプロシージャにあなたの機能を変更することだと思います。次に、クエリは、そのテーブルの検索された内容と結合することができます。 – RBarryYoung

答えて

1

OPENQUERYを使用し、リモートサーバー上の指定されたクエリで直接フィルタリングする必要があります。こうすることで、フィルタリングが他のサーバー上で行われていることを確認できます。 contrqaryでは、リモートサーバからすべてのデータを取得してローカルにフィルタリングすることができます。なぜそれが遅いのかを説明します。したがって、2番目のアプローチでは、OPENQUERYを使用するのが理想的なソリューションです。

これにリンクサーバーを作成する必要があります。

クエリ構文は、T-SQLではなくリモートサーバーの構文であることを考慮する必要があります。

OPENQUERY

+0

テストするリンクサーバーを作成しましたが、構文ではクエリの文字列を変更できません。どのようにコードパラメータを渡すのですか? – IronicMuffin

関連する問題