次のストアドプロシージャがあります
CREATE PROCEDURE [dbo].[MyStored]
@state int
AS
SELECT blahblahblah WHERE StoredState=@state LotsOfJoinsFollow;
RETURN 0
@stateを0
と1
としてそのストアドプロシージャを呼び出し、両方の呼び出しによって結果セットがUNION
セマンティクスと組み合わされて返されるようにし、新しい結果セットを作成したいと思います。最初の呼び出しと2番目の呼び出しの両方からの行があります。
(架空のSQL)のようなもの:
(EXEC MyStored 0) UNION (EXEC MyStored 1);
どうすればそれを達成できますか?
これは問題を単純化しすぎている可能性がありますが、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
create table #table (
.....
)
insert into #table exec MyStored 0
insert into #table exec MyStored 1
select * from #table
drop table #table
次のような一連のステートメントの代わりに:
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)になります。
長い道のりは、これを行うラッパーを作成することです。これは、状態のリストを取得して、返される最終テーブルに追加する関数です。
また、このプロシージャを呼び出しているテクノロジでレコードの連結を実行することもできます(つまり、.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 Article と MS SQLヒントArticle で、詳細をよりよく理解できます。
。
編集:int値のコンマ区切りリストを渡すため、param @ stateはnVarCharである必要があります
呼び出しているストアドプロシージャに、呼び出し元のプロシージャと同じ名前の一時テーブルがある場合、このエラーが発生します。
例えばsp1には一時テーブル#resultsがあります
sp2 create table #results(fields)次に、sp2の#resultsに挿入しようとすると、sp1を呼び出した結果がこのエラーで失敗します。 sp2の一時テーブルを#resultに変更して再試行すると、これが機能することがわかります。