2011-09-29 8 views
0

はその@totalresultが正しくインクリメントされますが、プロシージャ2で返される値は0 がどのように右のそれを得るためです。次の例でSQL Server 2008の、ネストされた手順の問題

Procedure1 
.......... 
IF(@errorcode<>0) ROLLBACK TRANSACTION 
ELSE COMMIT TRANSACTION 
SELECT @errorcode 

Procedure2 
.......... 
WHILE [condition] BEGIN 
    EXEC @proc1result = Procedure1 [parameters] 
    IF(@proc1result=0) SET @[email protected]+1 
END 
SELECT @totalresult 

問題を考慮するとされて?

私はSQL Server 2008とEntity Framework 4を使用しています。 プロシージャ1はうまくいきます。

答えて

0

(1)最初のストアドプロシージャの場合は、あなたがRETURN @errorcodeなくSELECT @errorcodeを使用する必要があります。これはまた私のの推薦です。

OR(NOT AND)

(2)第二のストアドプロシージャの場合は、あなたがこのようなINSERT ... EXEC Procedure1使用する必要があります。

WHILE [condition] 
BEGIN 
    DECLARE @Results TABLE (RetValue INT PRIMARY KEY); 

    INSERT @Results 
    EXEC Procedure1 [parameters]; 

    --IF 0=ALL(SELECT a.RetValue FROM @Results a) 
    IF NOT EXISTS(SELECT * FROM @Results a WHERE a.RetValue <> 0) 
     SET @[email protected]+1; 

END 
SELECT @totalresult 
+0

プロシージャ1ロールバックからのトランザクションが「INSERT-EXECステートメント内でROLLBACKステートメントを使用できません。例外は、すべてがうまくいく場合、正しい結果を得るたびにProcedure1がコミットします。 – gigi

+0

@gigi:私の答えを見れば、私の推薦が見えます。ストアドプロシージャの場合、エラーコードを返すためには 'RETURN @ something'を使用する必要があり、レコードセットを返すにはSELECT something ...を使用する必要があります。 –

0

"が、プロシージャ2で返される値は0である"

あなたはSELECT @totalresultを行います。それはreturn @totalresultであるべきですか? Upendraへ

回答...

CREATE PROC dbo.TestReturn (@InValue int) 
AS 
Return @Invalue+1 
GO 

declare @value int 
exec @value = TestReturn 100 
select @value 
+0

をどのように文を返すことができるの手順に戻ります?。それは機能するはずです。 –

+0

Entity Frameworkを使用しているので、スカラー値を返すためにreturnの代わりにselectを使う必要があると思われます。 – gigi

関連する問題