2011-12-29 99 views
7

私は次のストアドプロシージャ2つのストアドプロシージャ呼び出しの結果セットを結合するにはどうすればよいですか?

CREATE PROCEDURE [dbo].[MyStored] 
    @state int 
AS 
    SELECT blahblahblah WHERE [email protected] LotsOfJoinsFollow; 
RETURN 0 

を持っていると私は@stateが01されているストアドプロシージャを呼び出すと、私が持っているように、結果セットがUNIONセマンティクスと組み合わせるの両方の呼び出しによって返さしたいのですが最初の呼び出しと2番目の呼び出しの両方からの行を持つ新しい結果セット。 (虚SQL)のような

何か:

(EXEC MyStored 0) UNION (EXEC MyStored 1); 

どのように私はそれを達成していますか?

+0

@stateをコンマで区切っても構いませんか? (例:state = '0,1') - 答えはあなたの答えによって異なります。 –

+0

@レイK:わかりませんが、私は解決しやすいソリューションを好むでしょう。 – sharptooth

+2

重複:http://stackoverflow.com/questions/5292069/union-the-results-of-multiple-stored-procedures – goric

答えて

12

値ではなく=:

/*Create a table with the same columns that the sproc returns*/ 
CREATE TABLE #tempblahblah(blahblahblah NVARCHAR(50)) 

INSERT #tempblahblah (blahblahblah) 
EXEC MyStored 0 

INSERT #tempblahblah (blahblahblah) 
EXEC MyStored 1 

SELECT * FROM #tempblahblah
1

これを行うラッパーを作成するのは、状態のリストを取得して返される最終テーブルに追加する関数です。また、あなたは、リストを渡して微なら

(つまり、あなたがに見ている各状態の結果セットを追加する.NETた)このプロシージャを呼び出して、レコードの連結の操作を行うされているものの技術持っている可能性があり

状態を「状態」パラメータに設定すると、動的SQLクエリを作成できます。

CREATE PROCEDURE [dbo].[MyStored] 
    @state nvarchar(150) 
AS 

-- @state needs to be pre-formatted in a list for an in-clause 
-- i.e. 1,2,10 (if it was a string list, you'd need to do use double single quotes around the items - ''1'',''2'',''10'' 

DECLARE @SQL nVarChar(5000) = ' 
    SELECT blahblahblah 
    FROM LotsOfJoins 
    WHERE StoredState in (' + @state + ')' 


exec sp_executeSql @sql 

これは簡単な手順には最適です。しかし、変更が必要な場合は、維持に時間がかかることがあります。

。ここで

CodeProject Articleと詳細

に行くより良い仕事をしていませんMS SQL Tips Articleです。

EDITは:のparam @stateがintのカンマ区切りのリストでは、あなたの通過以来、NVARCHARをする必要があります。これは、問題をoversimplifyingていますが、SPを管理している場合は、ちょうどで使用することができる

5
create table #table ( 
    ..... 
) 

insert into #table exec MyStored 0 
insert into #table exec MyStored 1 

select * from #table 

drop table #table 

CREATE PROCEDURE [dbo].[MyStored] 
AS 
    SELECT blahblahblah WHERE StoredState IN (0,1) LotsOfJoinsFollow; 
RETURN 0 

これはちょうど両方のSPROCの結果をプッシュし、オプションでない場合は、一時テーブルに呼び出し、

3

またこのような一連のステートメントに:MyStoredへの二つの呼び出しの結果ではなくUNION句(または、だろう

INSERT INTO #YourTempTable 
EXEC (' 
    EXEC MyStored 0; 
    EXEC MyStored 1; 
'); 

INSERT INTO #YourTempTable 
EXEC MyStored 0; 
INSERT INTO #YourTempTable 
EXEC MyStored 1; 

あなたは以下のような1つのINSERT ... EXECステートメントを使用することができます、UNION ALLED)、前のメソッドと同様です。

0

呼び出し元のストアドプロシージャに、呼び出し元のプロシージャと同じ名前の一時テーブルがある場合は、このエラーが発生します。

sp1にはtempテーブルがあります。

sp2 create table #results(fields) sp2を#resultsに挿入しようとすると、sp1を呼び出した結果がこのエラーで失敗します。 sp2の一時テーブルを#resultに変更してやり直してみてください。

関連する問題