【问题标题】:SQL SERVER 2008 , Nested procedures issueSQL SERVER 2008,嵌套过程问题
【发布时间】:2011-09-29 09:11:56
【问题描述】:

考虑下面的例子

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

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

问题是@totalresult 正确递增但Procedure2 返回的值为0。 如何正确处理?

我正在使用 sql server 2008 和 Entity Framework 4。 程序 1 运行良好。

【问题讨论】:

    标签: .net sql-server sql-server-2008


    【解决方案1】:

    (1) 对于第一个存储过程,您应该使用RETURN @errorcode 而不是SELECT @errorcode。这也是我的建议。

    或(非与)

    (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 @totalresult=@totalresult+1;
    
    END
    SELECT @totalresult
    

    【讨论】:

    • 如果来自procedure1 的事务回滚,我得到“不能在INSERT-EXEC 语句中使用ROLLBACK 语句。”例外,如果一切顺利,并且每次我得到正确的结果时,Procedure1 都会提交。
    • @gigi:如果你看看我的回答,你会看到我的建议。对于存储过程,必须使用RETURN @something 来返回错误代码,而必须使用SELECT something ... 来返回记录集。
    【解决方案2】:

    "但是Procedure2返回的值为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
    

    【讨论】:

    • return 语句如何在过程中返回?它应该可以正常工作。
    • 由于我使用的是实体框架,看来我需要使用 select 而不是 return 来返回一个标量值
    猜你喜欢
    • 2011-08-20
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多