DECLARE @ErrorSum int
   SET @ErrorSum = 0
  
   BEGIN TRAN
   
    UPDATE XXXXXXXXXXXXXXXXXX
    SET @ErrorSum=@ErrorSum+@@ERROR
 
    UPDATE XXXXXXXXXXXXXXXXXX
    SET @ErrorSum=@ErrorSum+@@ERROR    UPDATE XXXXXXXXXXXXXXXXXX
    SET @ErrorSum=@ErrorSum+@@ERROR
   
  IF (@ErrorSum<>0)
    BEGIN
     ROLLBACK TRAN
     RETURN 0
    END
    ELSE
    BEGIN
     COMMIT TRAN
     RETURN 1
    END

解决方案 »

  1.   

     BEGIN TRANSACTION   
     BEGIN TRY   
       
     UPDATE CampaignCust  
                    SET SaleNo = C.SaleNo   
                   FROM CampaignCust A   
           INNER JOIN CampaignOffer B WITH(NOLOCK)  
                        ON A.CampaignID = B.CampaignID and A.BrandCode = B.BrandCode and A.OfferID = B.OfferID   
           INNER JOIN SaleCoupon C WITH(NOLOCK)  
                        ON A.BrandCode = C.BrandCode AND A.CouponNO = C.CouponNo   
                        WHERE C.SaleNo IS NOT NULL  
                          AND C.ModiDateTime > CAST(DATEADD(DD, -2, CAST(GETDATE() AS DATE)) AS DATETIME)  
       
     COMMIT TRANSACTION  
     END TRY    
     BEGIN CATCH  
     IF @@TRANCOUNT > 0  
      ROLLBACK TRANSACTION  
      
     SET @ErrorMessage = CONVERT (VARCHAR, ERROR_NUMBER ()) + CHAR (12) + ERROR_MESSAGE ()       
     SET @ErrorSeverity = ERROR_SEVERITY ()  
     SET @ErrorState  = ERROR_STATE ()  
      
     RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState, @ErrorCode, @ErrorParam1, @ErrorParam2);   
     END CATCH  
      

  2.   

    以下示例使用 TRY…CATCH 构造的 CATCH 块中的 XACT_STATE 来确定是提交事务还是回滚事务。由于 SET XACT_ABORT 设置为 ON,因此违反约束的错误将导致事务进入无法提交的状态。USE AdventureWorks;
    GO-- SET XACT_ABORT ON will render the transaction uncommittable
    -- when the constraint violation occurs.
    SET XACT_ABORT ON;BEGIN TRY
        BEGIN TRANSACTION;
            -- A FOREIGN KEY constraint exists on this table. This 
            -- statement will generate a constraint violation error.
            DELETE FROM Production.Product
                WHERE ProductID = 980;    -- If the delete operation succeeds, commit the transaction. The CATCH
        -- block will not execute.
        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        -- Test XACT_STATE for 0, 1, or -1.
        -- If 1, the transaction is committable.
        -- If -1, the transaction is uncommittable and should 
        --     be rolled back.
        -- XACT_STATE = 0 means there is no transaction and
        --     a commit or rollback operation would generate an error.    -- Test whether the transaction is uncommittable.
        IF (XACT_STATE()) = -1
        BEGIN
            PRINT 'The transaction is in an uncommittable state.' +
                  ' Rolling back transaction.'
            ROLLBACK TRANSACTION;
        END;    -- Test whether the transaction is active and valid.
        IF (XACT_STATE()) = 1
        BEGIN
            PRINT 'The transaction is committable.' + 
                  ' Committing transaction.'
            COMMIT TRANSACTION;   
        END;
    END CATCH;
    GO
      

  3.   

    在2012中,微软终于增加了THROW语句
    http://www.linuxidc.com/Linux/2012-09/70915.htm
      

  4.   

    上面2位兄弟给出了比较大例子,你的写法没有try catch好,如果发生错误,你的写法程序捕获得到什么异常信息吗?如果只是返回0,1,那你知道DB发送了什么错误吗?
      

  5.   

    写法1,set xact_abort on
    BEGIN TRAN
     UPDATE XXXXXXXXXXXXXXXXXX
     
     UPDATE XXXXXXXXXXXXXXXXXX
     
     UPDATE XXXXXXXXXXXXXXXXXX
    COMMIT TRAN
      

  6.   

    写法2,适用于所有SQL Server版本.begin tran
     UPDATE XXXXXXXXXXXXXXXXXX
     
     if @@Error<>0
     begin
       rollback tran
       goto errmsg
     end
     
     UPDATE XXXXXXXXXXXXXXXXXX if @@Error<>0
     begin
       rollback tran
       goto errmsg
     end
     
     UPDATE XXXXXXXXXXXXXXXXXX if @@Error<>0
     begin
       rollback tran
       goto errmsg
     end
    commit tran
    return 1errmsg:
    return 0
      

  7.   

    写法2,适用于所有SQL2005及以上版本.begin try  
      begin tran
        UPDATE XXXXXXXXXXXXXXXXXX
        UPDATE XXXXXXXXXXXXXXXXXX
        UPDATE XXXXXXXXXXXXXXXXXX
      commit tran
    end try
    begin catch
      rollback tran
    end catch