• sql server 存储过程、事务,增删改


    CREATE procedure [dbo].[sp_TableSave]        
    @TypeID tinyint,    --     0 新增,1 修改,2 删除        
    @ID int,        
    @Name nvarchar(32),        
    @ProductIDs varchar(1024),        
    @BackColor nvarchar(128),        
    @UID int,        
    @Creator nvarchar(32),        
    @Error nvarchar(100)='1' output        
    as        
    set nocount on         
    begin try        
    begin transaction    --    开始事务
     declare @currDate SMALLDATETIME      
     SET @currDate=GETDATE()     
     if(@TypeID='1')  --修改        
     begin        
       update ProductActivity set Name=@Name,ProductIDs=@ProductIDs,Backcolor=@BackColor,IsPush=1 where ActivityID=@ID        
               
       -- 更新移除产品log        
       insert into OperateLog(UID,UserName,Title,Content,CreateTime)        
       select @UID,@Creator,'更新',CAST(ProductID as varchar(10))+' /Activity:0',@currDate       
       from Product AS p      
       WHERE ActivityID=@ID and NOT EXISTS(      
      select 1 from dbo.F_split(@ProductIDs,',') AS t where t.f=p.ProductID      
       )      
             
       -- 更新移除产品      
       update p set ActivityID=0,IsPush=(case when p.status=0 then 1 else 0 end)      
       from Product AS p      
       WHERE ActivityID=@ID and NOT EXISTS(      
      select 1 from dbo.F_split(@ProductIDs,',') AS t where t.f=p.ProductID      
       )       
             
       -- 更新新增产品log      
       insert into OperateLog(UID,UserName,Title,Content,CreateTime)        
       select @UID,@Creator,'更新',CAST(ProductID as varchar(10))+' /Activity:'+CAST(@ID as varchar(10)),@currDate       
       from Product AS p      
       WHERE ActivityID<>@ID and EXISTS(      
      select 1 from dbo.F_split(@ProductIDs,',') AS t where t.f=p.ProductID      
       )      
               
       -- 更新新增产品      
       update p set ActivityID=@ID,IsPush=(case when p.status=0 then 1 else 0 end)      
       from Product AS p      
       WHERE ActivityID<>@ID and EXISTS(      
      select 1 from dbo.F_split(@ProductIDs,',') AS t where t.f=p.ProductID      
       )       
     end        
     else if(@TypeID='2') --删除        
     begin        
       -- 删除 ProductActivity      
       update ProductActivity set Status=1,IsPush=1 where ActivityID=@ID        
               
       -- 写入product改动log        
       insert into OperateLog(UID,UserName,Title,Content,CreateTime)        
       select @UID,@Creator,'更新',cast(ProductID as varchar(10))+'/Activity:0',@currDate from Product where ActivityID=@ID        
               
       -- 更新product        
       update Product set ActivityID=0,IsPush=(case when Product.status=0 then 1 else 0 end) where ActivityID=@ID        
     end        
     else      --新增        
     begin        
       -- 更新ProductActivity表        
       declare @NewID int        
       insert into ProductActivity(Name,ProductIDs,Backcolor,Creator,CreateTime,IsPush)         
       values(@Name,@ProductIDs,@BackColor,@Creator,@currDate,1)        
       set @NewID = SCOPE_IDENTITY()        
                    
       -- 更新product表      
       update p set ActivityID=@NewID, IsPush=(case when p.Status=0 then 1 else 0 end)       
       FROM Product AS p      
       INNER JOIN dbo.F_split(@ProductIDs,',') AS t ON t.f=p.ProductID      
               
       -- 写product改动log        
       insert into OperateLog(UID,UserName,Title,Content,CreateTime)        
       select @UID,@Creator,'更新', CAST(ProductID as varchar(10))+'/Activity:'+CAST(@NewID as varchar(10)),@currDate       
       from Product where ActivityID=@NewID        
     end        
     set @Error='0'        
    commit transaction  --    提交事务
    return;        
    end try        
    begin catch     --    异常
      set @Error='1-'+ERROR_MESSAGE()        
      rollback transaction  --    回滚事务
      return;        
    end catch
  • 相关阅读:
    如何使用websocket实现前后端通信
    影响MySQL的性能(一)磁盘的选择
    springboot结合日志门面SLF4j和日志实现Logback的使用
    分享一个猜数字小游戏的脚本
    关于drop table *** purge (drop后不过回收站)
    关于DateBase link(dbLINK)及同义词
    关于数据更新(update)
    关于insert into(插入值)
    关于wm_concat(把一列的值,通过','进行分隔后,合并成一个值进行显示)
    关于PIVOT(用于行转列)
  • 原文地址:https://www.cnblogs.com/flywing/p/5006509.html
Copyright © 2020-2023  润新知