zoukankan      html  css  js  c++  java
  • 触发器批量业务操作实现方式 update触发器用游标处理

    USE [Test]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
            ALTER  TRIGGER [dbo].[trg_InsertAndUpdate]
            ON [dbo].[Shop_OrderAmount]
            FOR UPDATE 
            AS
            BEGIN 
            SET NOCOUNT ON;
            declare    @oldQty int,
            @newQty  int,
            @ShopGid uniqueidentifier,
            @ProdGid uniqueidentifier,
            @tempShop Nvarchar(MAX)
            --更新前的数据
            select @oldQty=Qty,
            @ShopGid =ShopGid,
            @ProdGid=ProdGid
             from deleted; 
    
            BEGIN
            --更新后的数据            
            select @newQty = Qty  from inserted;
            --声明游标
            declare cursorShopQty cursor  for 
            (select  DISTINCT A.Gid  from inserted A
            inner join deleted B on A.Gid=B.Gid
            )
            --打开游标--
            open  cursorShopQty 
            --开始循环游标变量--
            fetch next from cursorShopQty into @tempShop
            --返回被 FETCH语句执行的最后游标的状态--    
            while @@FETCH_STATUS = 0    
            if  (update(Qty) and @newQty<>@oldQty)
            BEGIN            
            INSERT INTO Shop_OrderLog
            (Gid,ShopGid,ProdGid,Qty,UserQty, CreateDate)
            select NEWID(),
            B.Gid,B.ShopGid,B.ProdGid,B.Qty, isnull(A.Qty,0)-ABS(B.Qty),
            GETDATE()
            from inserted A   inner join deleted B on A.Gid=B.Gid   where  A.Gid=@tempShop
              --转到下一个游标,没有会死循环       
            fetch next from cursorShopQty into @tempShop   
            END   
            close cursorShopQty  --关闭游标
            deallocate cursorShopQty   --释放游标
            END
            END

    游标处理:触发器中DELETE和INSERTED其实是两张虚表,因此用变量获取仅能得到一条数据,但是如果用游标的话可以获取到位于虚表中的所有数据,批量处理

    USE [Test]
    GO
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
            ALTER  TRIGGER [dbo].[trg_InsertAndUpdate]
            ON [dbo].[Shop_OrderAmount]
            FOR UPDATE 
            AS
            BEGIN 
            SET NOCOUNT ON;
            declare    @oldQty int,
            @newQty  int,
            @ShopGid uniqueidentifier,
            @ProdGid uniqueidentifier
            
            --更新前的数据
            select @oldQty=Qty,
            @ShopGid =ShopGid,
            @ProdGid=ProdGid
             from deleted; 
    
            BEGIN
            --更新后的数据            
            select @newQty = Qty  from inserted;
            
            if  (update(Qty) and @newQty<>@oldQty)
            BEGIN            
            INSERT INTO Shop_OrderLog
            (Gid,ShopGid,ProdGid,Qty,UserQty, CreateDate)
            select NEWID(),
            B.Gid,B.ShopGid,B.ProdGid,B.Qty, isnull(A.Qty,0)-ABS(B.Qty),
            GETDATE()
            from inserted A   inner join deleted B on A.Gid=B.Gid  
             
            END
            END

    未使用游标处理:触发器中DELETE和INSERTED是两张虚表,那么其实上述的操作也可以这么来

  • 相关阅读:
    How to install php 7.x on CentOS 7
    Azure新建的CentOS设置root账户的密码
    远程激活.NET REFLECTOR(不能断网)
    C# WebApi 配置复杂路由不生效的问题
    在Mac上激活Adobe产品
    WIN10更新后出现无法联网的问题
    Mac安装SSHFS挂载远程服务器上的文件夹到本地
    输入三个数值,输出其中的最大值和最小值
    登录接口,只为自己能尽快吐槽一下这段代码
    随手记
  • 原文地址:https://www.cnblogs.com/Warmsunshine/p/12100828.html
Copyright © 2011-2022 走看看