我在存储过程中要调用n个别的存储,一个存储不成功,就要回滚,改如何来作呢?CREATE PROCEDURE  OnlineHanding  
   @UserName  VARCHAR( 50 ),
   @ContractID              UNIQUEIDENTIFIER
ASBEGIN TRANSACTIONDECLARE   @ErrMessage         BIT
  
-----第一步处理不合格数据
EXEC OnlineCheckData @UserName ------更新  MST_AirlineId  和  FraeGoupID  ,RoutingI,以及检查和插入Routing和插入相关的表AirPortGroup,AirPortElement
EXEC OnlineUpdateData @UserName, @ContractID ,@ErrMessage OUTPUT--其他的操作.................IF @@ERROR = 0
 COMMIT TRANSACTION
ELSE ROLLBACK TRANSACTION
--这句delete是一定要做的
DELETE  OnlineTempTable   WHERE Operator = @UserName
GO

解决方案 »

  1.   

    是否在要调用的每个存储过程中返回个值,再根据这个返回的值来判断是否要rollback
      

  2.   

    在一个存储中出错误就要中止掉此存储后面的语句,该如何写呢?CREATE PROCEDURE  OnlineUpdateData
    @UserName  VARCHAR( 50 ) ,
    @ContractID               UNIQUEIDENTIFIER ,
    @ErrMessage          BIT  OUTPUT,
    @RollBackFalg INT OUTPUT
     AS -----更新 MST_AirlineId  和  FraeGoupID
    UPDATE OnlineTempTable
    SET MST_AirlineId = dbo.GetAirlineIDByAirCode( OAIR ) , FraeGoupID = dbo.GetFBGroupID( FB,@ContractID ) 
    WHERE Operator = @UserName  --AND  Error <> 'N' IF   @@ERROR<>0    SET @RollBackFalg=1
    ---在此语句出错就返回,如何写呢,我就是设RollBackFalg=1,就返回到的调用此存储的存储,然后根据RollBackFalg进行rollback
    INSERT INTO .......Go谢谢!
      

  3.   

    @@error是用来判断最近的SQL语句执行成功与否的全局函数,不建议楼主使用这个东西判断存储过程是否执行成功,相反地你应该在每个存储过程中使用这个函数来返回不同的值用来标志你的存储过程是否执行成功。使用return返回存储过程的结果,就好像C语言的函数一样的。在调用存储过程时候根据return的返回值判断是否执行成功就可以了。
      

  4.   

    使用TRY CATCH. 里边的任何一个存储过程出问题,要它抛异常,外边的sp一旦catch任何exception
    就rollback