一个SQL server的事务存储

-- =============================================
-- Author:        Evan
-- Create date: 2018年6月14日 16点27分
-- Description:    冻结BOL不允许GI,或取消冻结
-- =============================================
ALTER PROCEDURE [dbo].[SP_FRU_FreezeGIByBOLorCancle]
    (
      @BOL NVARCHAR(50) ,
      @UpdateBy NVARCHAR(50) ,
      @Flag INT --0表示冻结,1表示取消,2查询未GI的BOL的冻结信息
    )
AS 
    BEGIN
     --开始事务
        BEGIN TRANSACTION
   --设置一个存储报错代码的变量
        DECLARE @errorSum INT 
        SET @errorSum = 0
    --在每一条涉及到数据变动的语句后都累加一次报错代码
        IF ( @Flag = 0 ) 
            BEGIN
                UPDATE  ddd WITH ( ROWLOCK )
                SET     ddd.STATE = 0 ,
                        ddd.UpdateBy = @UpdateBy ,
                        ddd.UpdateDate = GETDATE()
                FROM    dbo.Fn_Split(@BOL, '/') fn
                        LEFT JOIN dbo.D_ControlGIByBOL ddd ON fn.value = ddd.BOL
                WHERE   ddd.ID IS NOT NULL;
                SET @errorSum += @@ERROR;
                INSERT  INTO dbo.D_ControlGIByBOL
                        ( ID ,
                          BOL ,
                          State ,
                          CreateBy ,
                          CreateDate 
                        )
                        SELECT  NEWID() id ,
                                fn.value ,
                                0 state ,
                                @UpdateBy createby ,
                                GETDATE() createdate
                        FROM    dbo.Fn_Split(@BOL, '/') fn
                                LEFT JOIN dbo.D_ControlGIByBOL ddd ON fn.value = ddd.BOL
                        WHERE   ddd.ID IS  NULL;
                SET @errorSum += @@ERROR;
               
            END
        IF ( @Flag = 1 ) 
            BEGIN
            --------------------------------------------------取消冻结
                UPDATE  D_ControlGIByBOL WITH ( ROWLOCK )
                SET     State = 1 ,
                        UpdateBy = @UpdateBy ,
                        UpdateDate = GETDATE()
                WHERE   BOL IN ( SELECT DISTINCT
                                        fn.value
                                 FROM   dbo.Fn_Split(@BOL, '/') fn )
                SET @errorSum += @@ERROR;
            END
            --报错代码不为0表示在执行上述sql时出现错误,回滚事务,撤销所有更改
        IF ( @errorSum <> 0 ) 
            BEGIN
                SELECT  '执行错误:' + CAST(@errorSum AS VARCHAR(50));
                ROLLBACK TRANSACTION 
            END
        ELSE
   --报错代码为0表示无报错信息,可以执行更改操作
            BEGIN
                IF ( @Flag = 0 ) 
                    BEGIN
                        SELECT  '批量冻结成功';
                    END
                IF ( @Flag = 1 ) 
                    BEGIN
                        SELECT  '批量取消冻结成功';
                    END
                IF ( @Flag = 2 ) 
                    BEGIN
                        SELECT  ddd.BOL,ddd.CreateBy,ddd.CreateDate,ddd.UpdateBy,ddd.UpdateDate,
                        CASE WHEN ddd.State=0 THEN '冻结'
                        WHEN ddd.State=1 THEN '未冻结'
                        ELSE '异常'
                        END as State
                        FROM    dbo.D_ControlGIByBOL ddd
                        WHERE   ddd.State = 0
                        ORDER BY CreateDate DESC
                    END
                COMMIT TRANSACTION
            END
    END

猜你喜欢

转载自www.cnblogs.com/evanmemo/p/9185920.html