1

ここに問題があります。Sql Serverストアドプロシージャの結果セットの結合

標準化されたデータを標準データセットに変換するストアドプロシージャがあります。

ビューと、異なるパラメータを持つストアドプロシージャの2つのデータセットと、異なる列を返すストアドプロシージャに送信されるデータについて報告する必要があります。

例私のビューのようなものが含まれる場合

ID Title Status Date 
1 How To Party Like a rockstar Approved 7/15/1989 
2 Too much of a good thing Approved 7/25/2001 
3 Needs More Cowbell Denied 11/11/2011 
4 Here Today Gone Tommorrow Approved 8/13/1969 
5 The way She moves Approved 12/13/2011 

そして、もう一つのparamaterリターンと手順の実行:

ID Do you like the ice Cream? How much would you pay for the ice cream? 
1 Yes 2 
2 Yes 5 
3 Yes 7 
4 No 2 
5 No 3 

そして、異なるパラメータを返すと同じ手順の実行を:

ID Total Number of Bell Peppers Total Number of Apples Total Number of Oranges 
1 7 6 6 
2 6 8 8 
3 32 7 5 
4 7 3 1 
5 12 1 1 
ストアドプロシージャが原因にインラインSQLで行うことができないことを念頭に置い

ID Title Status Date Do you like the ice Cream? How much would you pay for the ice cream? Total Number of Bell Peppers Total Number of Apples Total Number of Oranges 
1 How To Party Like a rockstar Approved 7/15/1989 Yes 2 7 6 6 
2 Too much of a good thing Approved 7/25/2001 Yes 5 6 8 8 
3 Needs More Cowbell Denied 11/11/2011 Yes 7 32 7 5 
4 Here Today Gone Tommorrow Approved 8/13/1969 No 2 7 3 1 
5 The way She moves Approved 12/13/2011 No 3 12 1 1 

キーピングを:私は得ることについて移動する方法を、ID列は、データセットを結合するために使用することができますキーであると仮定すると

正規化の性質と正規化の変換について説明していますが、ストアドプロシージャは、そのときに渡されるパラメータに応じて可変数の列を返すため、テーブル変数udfとして実行することはできません。それは実行されている(誰かがこれについて間違っていると私を指摘することができ、動的な列テーブル値のudfの方に私は非常に感謝するだろう)。

もし私がどこかでビューと2つのストアドプロシージャを1つのストアドプロシージャに持ってきて、そのような方法でデータセットを返せば、それが私の最終目標になります。私もそのアドホック分散クエリはこのサーバー(ない私の決定)にオンにすることはできません言及する必要がある

解像度

スチュアートエインズワースの答えから少し助けを借りて、私は仕事をすることができましたそれを出す。全体としての私の最初の問題は、各クロス集計表に対して列が動的であることでした。その一環として、私はこのケースでは9は、私は私が構築していた項目を知ることができますパラメータは、カンマ区切りの文字列としての列が返される関数...

 DECLARE 
      @PivotColumns VARCHAR(MAX) 

     SET @PivotColumns = dbo.fnGetFormPivotColumns(9) 

を作成していたので、 。そこから、私はこの思い付いたように、動的に一時テーブルを構築するための基本SPでの機能のほんの繰り返しだった:

IF object_id('tempdb..#temp_DEP') IS NOT NULL 
    DROP TABLE #temp_DEP 


CREATE TABLE #temp_DEP (APPLICATION_ID int) 
EXEC ('ALTER TABLE #temp_DEP ADD ' + @PivotColumns) 

INSERT INTO #temp_DEP 
    EXEC GetFormCrossTab 9 

単純なSELECT * FROM #temp_DEP私はまさに私得ていることを示しています欲しいです。

私がしなければならないことは、他のパラメータの処理を繰り返すことと同じストアドプロシージャ内に2つのデータセットを取得することだけです。

+0

を私はあなたに実行される課題は、procのからあなたの可変出力だと思います。 http://stackoverflow.com/questions/653714/how-to-select-into-temp-table-from-stored-procedure形状が一貫していれば、結果を表に挿入して、そのような結果をまとめることができます。それ以外の場合は、コピー・ペーストの継承を見て、すべてのロジックをまとめてみてください。 – billinkc

+0

残念なことに、Ad Hoc分散クエリがオフになっていて、私はそれを有効にできませんので、openrowset/opendatasourceはオプションではありません。 – Patrick

答えて

1

あなたはたとえば、ストアドプロシージャを構築し、自分の各パラメータを満たすためにIF文を使用することができます

CREATE PROC someproc @parameter AS 

CREATE TABLE #scratch1 (columns)... 
CREATE TABLE #scratch2 (columns)... 

IF @parameter = 1 
BEGIN 
INSERT INTO #scratch1 
exec oldproc @parameter 
END 

IF @parameter = 2 
BEGIN 
INSERT INTO #scratch1 
exec oldproc @parameter 
END 


SELECT * 
FROM view v 
LEFT JOIN #scratch1 s1 ON v.ID =s1.ID 
...etc 
+0

私は動的にテンポラリテーブルを構築したいと思っています...理論的には無制限の数のパラメータになる可能性があります...このレポートでは、2つの特定の項目のみになります...この特定のレポート、私はちょうどよりダイナミックなソリューションを望んでいた。 – Patrick

+0

私はストアドプロシージャの1つは13列のようなものを返しますが、カラム名の文言は実際には – Patrick

+0

というように頻繁に変更される傾向があります...もし私が動的にtempテーブルを構築するベースspからコードを取得すれば...それが動作するはずのレポートのためにこの親spに入れてください...病気はそれに亀裂を取る。 – Patrick

1

渡されたパラメータに応じて、条件付き結果セットを使用して結果を2つのスクラッチテーブルのいずれかに挿入できますか?

次に、ビューをスクラッチテーブルに結合する別のストアドプロシージャを作成できます。

exec stored_proc_with_conditional_output 

select * from 
view v 
left outer join scratch1 s1 on v.ID = s1.ID 
left outer join scratch2 s2 on v.ID = s2.ID 
+0

私はそれをユニークにし、それからクエリを行うためにパラメータを使用してテンポラリテーブルを作成することがわかりました...しかし、呼び出し元のSPが完了したときにテンポラリテーブルが破壊されることはありませんか?しかし、おそらくグローバルテンポラリテーブルは、使用するのに十分長い間生き残るでしょう。 – Patrick

+0

一時テーブルは、個々のsprocにスコープされるかもしれません。もしそうなら、sprocが一度に複数回呼び出される可能性がある場合は、実際のテーブルを使用して並行性の問題を考慮する必要があります。 SQL Server 2008以上を使用している場合は、テーブル変数を使用する可能性も検討できます。 – jmacinnes

+0

私はテーブル変数を使用しますが、動的にそれらをデクリメントする方法を見つけることはできません...私はtempテーブルを動的に構築しています...もし私がそれをfiggureしたらどうすればよいでしょうか?ストアドプロシージャからの出力パラメータとして?それは働くだろうか? – Patrick

0

あなたはクエリを実行し、LINQと一緒にそれらを破る必要があります。

例えば、これは、新しいストアドプロシージャになります。これは非常に高速で、オンデマンドで実行するように設定することもできるため、メモリと処理フットプリントは小さくすべきです。

これを行う方法の例が必要ですか、それとも十分な提案ですか?

+0

もしこれを.netで使用していたのであれば、おそらく問題にはならないでしょう...しかしSSRSレポートに行く必要があります...そして、私はlinqをssrsに実装しようとしていません可能であれば、わかりません) – Patrick

+0

@Patrick - point taken - 私はそれを役に立つと思うかもしれない他の人への将来の参考としてここに残します。 – Hogan

関連する問題