2009-03-03 6 views
10

"Problem calling stored procedure from another stored procedure via classic ASP"という質問にkcrumleyが記述したのと同じ問題があると思います。しかし、彼の質問は本当に解決策が含まれていないので、私はそれを別の打撃を与えるだろう、私自身の観察を追加:MS SQL:ストアドプロシージャで呼び出されたストアドプロシージャの戻り値を表示しない

私は2つのストアドプロシージャがあります。どちらの手順は、「NOCOUNT ON SET含まれていることを

CREATE PROCEDURE return_1 AS BEGIN 
    SET NOCOUNT ON; 
    SELECT 1 
END 

CREATE PROCEDURE call_return_1_and_return_2 AS BEGIN 
    SET NOCOUNT ON; 
    EXEC return_1 
    SELECT 2 
END 

は注意を" "call_return_1_and_return_2"を実行すると、まだ2つのレコードセットが得られます。最初に値1、次に値2を返します。

これは、ASP(従来のVBScript ASP)をトラックからスローします。

最初の結果セットをどのように抑制できるかについてのヒントはありますか?何故NOCOUNTがあってもそれはなぜですか?

ASPで最初のレコードセットをスキップすることはできません。私は "データベースのみ"のソリューションが必要です。

+0

応答のカップルは、あなたが返すようにSELECTから変更できることを指摘しているが、これは素晴らしい質問です - どのようなネストされたストアドプロシージャは、何かがそれを呼び出すため、選択する必要がある場合には、あなたはそれを変更することはできませんか?そのような結果セットを「飲み込む」ことが可能かどうか疑問に思います。 –

答えて

8

これを引き起こすNOCOUNTではなく、ストアドプロシージャにはそれぞれselectがあり、それぞれが独自の結果セットに入っています。これは、選択を行うのではなく、出力パラメータを使用して番号1を返すように、最初のストアドプロシージャを変更することで回避できます。 2番目のストアドプロシージャは、出力パラメータを調べて、実行する必要があるデータを取得できます。

は、これらの変数が、出力レコードセットを返されていません。この

CREATE PROCEDURE Proc1 
(
    @RetVal INT OUTPUT 
) 
AS 
SET NOCOUNT ON 
SET @RetVal = 1 


CREATE PROCEDURE Proc2 
AS 
SET NOCOUNT ON 
DECLARE @RetVal int 
EXEC [dbo].[Proc1] 
     @RetVal = @RetVal OUTPUT 
SELECT @RetVal as N'@RetVal' 
2

のようなものを試してみてください。私は、SQLサーバがクライアントに出力をフラッシュするとすぐに、あなたは困惑し、それを取り戻すことはできないと思います。

これは、return_1にレコードを選択するか制御するかを制御するSP return_1にパラメータを追加することで解決します。

12

Mattが彼のコメントで指摘しているように、どちらの解決策も最初の結果セットを実際には飲み込んでいません。 私はあなたがこれを望む理由はわかりませんが、テーブル変数を使って最初のexecの結果を「取り込む」ことができます。結果セットの列の正確な量とタイプと一致する必要があります。これと同じように:

CREATE PROCEDURE return_1 AS 
    SET NOCOUNT ON; 
    SELECT 1 
GO 
CREATE PROCEDURE call_return_1_and_return_2 AS 
    SET NOCOUNT ON; 
    DECLARE @Result TABLE (res int) 
    insert into @Result EXEC return_1 
    SELECT 2 
GO 
関連する問題