web-dev-qa-db-ja.com

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

次のストアドプロシージャがあります

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

@stateを01としてそのストアドプロシージャを呼び出し、両方の呼び出しによって結果セットがUNIONセマンティクスと組み合わされて返されるようにし、新しい結果セットを作成したいと思います。最初の呼び出しと2番目の呼び出しの両方からの行があります。

(架空のSQL)のようなもの:

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

どうすればそれを達成できますか?

8
sharptooth

これは問題を単純化しすぎている可能性がありますが、spを制御できる場合は、=ではなくinを使用してください。

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

これがオプションでない場合は、両方のsproc呼び出しの結果を一時テーブルにプッシュするだけです。

/*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
14
brian
create table #table ( 
    .....
)

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

select * from #table

drop table #table
5
adyusuf

次のような一連のステートメントの代わりに:

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

あなたは1つを使うことができますINSERT ... EXEC以下のようなステートメント:

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

MyStoredへの2回の呼び出しの結果は、前者の方法と同様に、UNIONed(または、むしろUNION ALLed)になります。

3
Andriy M

長い道のりは、これを行うラッパーを作成することです。これは、状態のリストを取得して、返される最終テーブルに追加する関数です。

また、このプロシージャを呼び出しているテクノロジでレコードの連結を実行することもできます(つまり、.NETに調査している各状態の結果セットを追加さ​​せる)

状態のリストを「state」パラメータに渡すことに問題がない場合は、動的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 ArticleMS SQLヒントArticle で、詳細をよりよく理解できます。

編集:int値のコンマ区切りリストを渡すため、param @ stateはnVarCharである必要があります

0
Ray K

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

例えばsp1には一時テーブル#resultsがあります

sp2 create table #results(fields)次に、sp2の#resultsに挿入しようとすると、sp1を呼び出した結果がこのエラーで失敗します。 sp2の一時テーブルを#resultに変更して再試行すると、これが機能することがわかります。

0
Alan Browne