2017-07-18 5 views
0

私はuniqueidentifierをとり、テーブルを返すストアプロシージャを持っています。私は何をしようとしていることは、通常のテーブルのように、これらの結果を使用することですが、私はSQLはまだ限られているし、それを許可していません実現SELECTクエリ内でストアドプロシージャを呼び出す方法は?

例(まだ!):代替は

SELECT * 
FROM MyTable MT 
WHERE NOT EXISTS 
    (SELECT * 
    FROM MyStoredProc(MT.ID) MSP 
    WHERE MT.SomeData = MSP.SomeData) 

ありますこの問題の解決策?また、ストアドプロシージャとは交換できないので、関数またはビューを使用することを推奨しないでください。私は、実際には、開発者がまだSQLの時代を考慮してこれを実装していないことにかなり驚いています。

本当にありがとうございます。

+2

テーブル値関数に変換できない場合は、ストアドプロシージャの結果をtempテーブルに挿入し、そのtempテーブルを利用するという方法があります。 – pmbAustin

+0

その問題は、ストアドプロシージャがMyTableテーブルの値として定義されているパラメータを受け取ることです。悲しいことに、SQLでは、この構文で一時表を塗りつぶしたり上書きすることはできません。 – AnotherProgrammer

+0

次に、 '可能なすべてのパラメータ値'を持つテーブルをテーブルにダンプするためにストアドプロシージャを書き直す必要があります。申し訳ありませんが、実際にあなたが求めていることをやる他の方法はありません。 – pmbAustin

答えて

0

その構文は機能しません。格納されたprocの結果を一時テーブルにダンプし、一時テーブルを参照する必要があります。 パラメータのため、私は、すべてのIDに対して一度に実行できるprocの新しいバージョンを作成するか、またはprocコードをテーブル値関数にドロップすることを提案します(これは使用しようとしている構文を使用して実行できます)。

+0

ストアドプロシージャには動的SQLが必要ですが、これはテーブル値関数には実装されていないため、オプションではありません。 – AnotherProgrammer

+0

正しいです... t-sql関数では動的SQLは使用できません。あなたは "MyTable"のすべての行を一度に処理できる動的なprocの第2版を書くことができますか?そうであれば、MyTableのすべての一意のIDに対してprocを実行するためにループを使用することで、それが却下されます。 –

+0

私は格納されたprocの詳細には触れませんが、選択される列の名前は、(他のいくつかのSELECTステートメントを介して)パラメータとして渡されるIDに基づいて動的に決定されます。したがって、すべてのIDをループしない限り、procを単一のIDを超えて拡張することはできません.UNION ALLを使用して結合します。 – AnotherProgrammer

関連する問題