从另一个存储过程调用存储过程

时间:2009-12-09 21:47:45

标签: sql-server-2005 tsql stored-procedures

我想从另一个SP拨打SP。我知道我可以轻易称之为。但问题是,如果在SP2中发生错误,那么我想要ROLLBACK SP1。

  SP1页       BEGIN Tran
      [部分准则]
      致电SP2
      [部分代码]

     

SP2
    BEGIN TRAN
    [部分准则]
    [错误来了]
    ROLLBACK TRAN

这将仅在sp2中回滚Tran。如果在sp2中发生错误,我也想要RollBack SP1。

任何帮助都将不胜感激。

6 个答案:

答案 0 :(得分:4)

在SP2中尝试RAISERROR

答案 1 :(得分:2)

似乎人们对其他信息网站有疑问......

它的要点是父程序在尝试执行孩子已经拥有的ROLLBACK时将通过异常。解决这个问题的方法是让父母在提交之前检查@trancount。

http://forums.asp.net/t/1259708.aspx

Create procedure [dbo].[parent]  as Begin Transaction Begin Try
    Exec Child End Try Begin Catch
    If @@Trancount > 0
        RollBack End Catch Commit 


Create procedure [dbo].[Child]  as Begin Transaction Begin Try
    --Do inserts here End Try Begin Catch
    If @@Trancount > 0
        RollBack
    RAISERROR('Error Occured',16,1) End Catch Commit

答案 2 :(得分:1)

一种可能性是使用@ErrorCode INT OUTPUT参数创建SP2,该参数指示调用者是否需要回滚或提交。

答案 3 :(得分:1)

您可以使用类似的错误代码(我不会编写代码,如果我是你,我该怎么做)

SP1
DECLARE ReturnVal
BEGIN TRAN
CODE
CALL SP1 ReturnVal output
IF ReturnVal=errorvalue
ROLLBACK TRAN

SP2
DECLARE ReturnVal output
BEGIN TRAN
CODE
ERROR
SET ReturnVal=errorVal
ROLLBACK
RETURN ReturnVal

答案 4 :(得分:1)

听起来你不需要嵌套的交易。尝试使用try blocks(psuedocode)控制提交/回滚:

begin try
  begin trans
  do stuff
  call other sp
  do more stuff
  commit trans
end try
begin catch
  rollback trans
  do something here to report failure to app
end catch

如果try块中的任何地方发生错误,包括使用另一个sp,则控件将传递给catch块并回滚事务。

答案 5 :(得分:0)

在第二个SP中创建一个输出参数,其类型为bit,表示发生了错误。基于此,您可以回滚SP 1。