USE [HXTst]
GOSET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER proc [dbo].[Pro_AdvBackAmount]as
BEGIN

declare @sql nvarchar(max)
declare @PeriNm int
declare @CtNm VARCHAR(MAX)
declare @OverDueCg floatBEGIN TRANSACTION 
set  @sql='update AdvBackInf Set ApporveState=''已审核'' where ContractNm=@CtNm'
      exec @sql
 set  @sql='update InterestReceive set RepayAmount=receivableAmount,PeriodRepyDate=@PeriNm where ContractNm=@CtNm'
      exec @sql
 set  @sql='update InterestReceive set RepayAmount=RepayAmount''+@OverDueCgwhere''where
 ContractNm=@CtNm and  PeriodRepyDate=@PeriNm and RepayType=''PeriodOverdueCharge'''
 exec @sqlCOMMIT TRANSACTION IF ( @@ERROR <> 0 )ROLLBACK TRANSACTION end以前都是ADO处理事务
以上代码是我的T-SQL事务处理,不知道对没有,情大家帮忙看下,

解决方案 »

  1.   

    这句错了,
    set @sql='update InterestReceive set RepayAmount=RepayAmount''+@OverDueCgwhere''where
    把'' 去掉。
      

  2.   

    当然有问题了你这样他永远也不会执行ROLLBACK TRANSACTION 
      

  3.   

    05 以及也可以使用SET XACT_ABORT  选项来控制,为 ON 时,如果执行 T-SQL 语句产生运行时错误,则整个事务将终止并回滚
    declare @sql nvarchar(max)
    declare @PeriNm int
    declare @CtNm VARCHAR(MAX)
    declare @OverDueCg float
    BEGIN TRY 
    BEGIN TRANSACTION  
    set @sql='update AdvBackInf Set ApporveState=''已审核'' where ContractNm=@CtNm'
      exec @sql
     set @sql='update InterestReceive set RepayAmount=receivableAmount,PeriodRepyDate=@PeriNm where ContractNm=@CtNm'
      exec @sql
     set @sql='update InterestReceive set RepayAmount=RepayAmount''+@OverDueCgwhere''where
     ContractNm=@CtNm and PeriodRepyDate=@PeriNm and RepayType=''PeriodOverdueCharge'''
     exec @sql
     IF XACT_STATE() = 1COMMIT TRANSACTION  
    END TRY
    BEGIN CATCH
     IF XACT_STATE() != 0
    ROLLBACK TRANSACTION 
    /*下面这个抛出错误信息,可要可不要*/ 
     SELECT 
            ERROR_NUMBER() AS ErrorNumber
            ,ERROR_SEVERITY() AS ErrorSeverity
            ,ERROR_STATE() AS ErrorState
            ,ERROR_LINE () AS ErrorLine
            ,ERROR_PROCEDURE() AS ErrorProcedure
            ,ERROR_MESSAGE() AS ErrorMessage;END CATCH
      

  4.   

    你把上面3个执行动态sql的语句整成一个放在exec里执行就可以了。
    如果你分开写的话,在出错那条语句之前成功执行的语句将不会被回滚
      

  5.   

    你的rollback已经无效了,要把commit也放到判断里面去。
      

  6.   

    一个事务中有三条exec @sql,出错回滚执行只会回滚出错的操作,出错之前的操作不会被回滚的