2009-06-26 33 views
1

これは、ストアドプロシージャ(SQL Server 2005を使用)で発生する問題です。このストアドプロシージャ内で、別のストアドプロシージャを呼び出すと、データが一時テーブルに格納されます。別のストアドプロシージャを呼び出すSQL Serverストアドプロシージャの問題

INSERT INTO #tmpTable (Column1, Column2, Column3) 
EXEC psp_rptInsideStoredprocedure 2 

この内部ストアドプロシージャには、どの列が渡されるかを決定するモードパラメータがあります。このモード(Mode2)では、この内部ストアドプロシージャが別のレポート(Mode1)に使用されるときに、3つの列のみが渡され、4つの列が渡されます。場合によっては、親ストアドプロシージャが4列を挿入しようとすると文句を言うことがあります。

私は常にモード2で渡していることは知っていますが、SQL Serverはこのストアドプロシージャが時には4つの列を返すことがあることを知っています。

解決策についてのご意見はありますか?ストアドプロシージャをチェーン

おかげ

ドン

+0

"Inside"プロシージャのソースを投稿すると役立ちます。 –

+0

同じセッションで呼び出し間に一時テーブルが削除されていますか? –

答えて

0

デイジーは、一般的に素晴らしいアイデアではありません。私はsprocへの呼び出しを取り除き、あなたが必要とするもののためにt-sqlをタイプします。あなたが本当に別のsprocを呼び出して設定されている場合。あなたはこの1つの状況に必要なものを正確に行う新しいsprocを作ります。

それはすべてについてですSingle Responsibility Principle

+4

もう一度 - コードを2つの別々のSProcsに分割することは、SRPのためかもしれません! –

+1

私は同意しません。 1つの特定のことをうまくやっているターゲット別のsprocsを作成することは、SRPがまさにそうであることです。 –

3

子手順は常に、同じ列数と型を返す必要があればNULLを使用してください。 2つのバージョンで結果が大きく異なる場合は、このように組み合わせることはできませんので、2つの異なる手順を検討する必要があります。

私はあなたの手順で推測しているだけですが、#ResultSet tempテーブルを作成して型パラメータに基づいてデータを設定することはできますが、常にすべての列などを返します。一時テーブルはオーバーヘッドであるためです。その場合には、ちょうどあなたの結果セットは、同じ数の列を返すことを確認してください。

IF @version=1 
BEGIN 
    SELECT col1, col2, NULL FROM ... WHERE ... 
END 
ELSE 
BEGIN 
    SELECT col1, col2, col3 FROM ... WHERE ... 
END 

その後、両方の親がそれを呼び出すときに、すべての列を受け入れ、彼らは、彼らが必要としないものを無視することができます。

関連する問題