2009-02-20 9 views
16

私は別のストアドプロシージャ(これをBと呼ぶ)を呼び出すストアドプロシージャ(Aと呼ぶ)を持っています。 Bには、Aの呼び出し元に返信したくないSELECTが含まれています。ストアドプロシージャ内の結果をストアドプロシージャ内で抑止するにはどうすればよいですか?

ここにはいくつかの非常に大雑把な擬似コードがありますが、その考え方を理解する必要があります。

これまでのように、AはBとBを呼び出していくつかのことを行い、気にしない結果を返します。 Aが完了すると、それ自身の結果セットが返されます。

Bの結果をAで抑制するにはどうすればよいですか?私はSQL Server 2005を使用しています。Bを変更したくないのは、それが動作していて複雑で複雑すぎるためです。

/* Assume this table matches the output of your procedure */ 
DECLARE @tmpNewValue TABLE (newvalue int) 
INSERT INTO @tmpNewValue 
EXEC ProcedureB 
+0

から呼び出された場合#__suppress_resultsはprocのB内表示されているので、それが結果セットをスキップする際に知っているので、それはこれを利用して手順Aを変更し、手順Bにパラメータを追加するには必要に応じて新しいパラメータ。 –

答えて

29

? プロシージャAはプロシージャCを呼び出す(「何か面白いことをする」だけです)、次に必要な選択を行い、プロシージャBはプロシージャCを呼び出してセカンドセレクトのオーバーヘッドと一時的なテーブルはごみ箱としてのみ使用されますか?ここで

+0

それはうまくいった。ありがとう。 – Brian

+0

私は喜んで助けてくれる – JoshBerke

+2

それは素晴らしい解決策です。しかしそれはまだオーバーヘッドを引き起こしますね。私は 'SET NORESULTSETS ON'のようなオプションがあったはずだと思います。私はほとんど常にその副作用のためだけにSPを呼び出し、私はそれの出力には興味がありません。 – ercan

1

・アム私は本当にSTOOPIDているが、別の方法でも、「いくつかの興味深い観光」べきではありません:あなたはこのような何かを試すことができ

+1

OPは「Bに変更を加えたくない」 – bdukes

+1

+1、ベストプラクティスは下降投票をすべきではありません。 – Chris

+0

新しく作成された行のIDなどの結果を返す作業は、SPでは非常に一般的です。 –

0

は、PROCの光修正は、あなたのニーズに合うか& Bです:

PROCEDURE A 
    CURSOR 
     CREATE TABLE #__suppress_results (col1 int) 
     CALL B -- I WANT TO SUPPRESS THE RESULTS FROM B 
    END 
    SELECT * 
END 
PROCEDURE B 
    Do some interesting things 
    IF OBJECT_ID('tempdb..#__suppress_results') IS NULL BEGIN 
     SELECT * 
    END 
END 

これは、ネストされたINSERT...EXECの問題を回避し、そのいくつかの他のオフのチャンスでPROC Bの既存の動作を維持しますprocを呼び出すと、#__suppress_resultsという名前の一時テーブルが作成されてからproc Bが呼び出されます。#[email protected]_resultsのような別の名前を使用してください。

そして、それは動作しますが、プロシージャ・Bは、PROC A.

関連する問題