2011-09-29 41 views
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 

的問題是,@totalresult正確遞增,而是由過程2返回的值是0 如何得到它的權利?

我正在使用sql server 2008和實體框架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

如果從procedure1回滾事務我得到「不能在INSERT-EXEC語句內使用ROLLBACK語句。」例外,如果一切順利,並且每當我得到正確的結果時,Procedure1都會提交。 – gigi

+0

@吉吉:如果你看我的答案,你會看到我的建議。對於存儲過程,必須使用'RETURN @ something'來返回錯誤代碼,而'SELECT something ...'必須用於返回記錄集。 –

0

「但過程2返回的值是0」

你做一個SELECT @totalresult。應該是return @totalresult

答到烏彭德拉...

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

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

如何return語句將返回程序?它應該在功能上工作。 –

+0

由於我使用實體框架,似乎我需要使用select而不是返回來返回標量值 – gigi