zoukankan      html  css  js  c++  java
  • 触发器捕获批量修改

      最近在批量更新数据时,发现无论怎么操作触发器都仅仅捕获到了一条数据,触发器代码大致如下。

    ALTER TRIGGER [dbo].[Trigger_Demo_Update] 
       ON  [dbo].[B_Demo_TB] 
       AFTER UPDATE
    AS 
    BEGIN
        SET NOCOUNT ON;
        DECLARE @NewData INT,@OldData INT;
    
        SELECT @OldData=Data FROM DELETED
    
        SELECT @NewData=Data FROM INSERTED
    
            IF(@OldData!=@NewData)
            BEGIN
                INSERT INTO M_TriggleSoft(Data)
                VALUES(@NewData)
            END
            
    END

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

    ALTER TRIGGER [dbo].[Trigger_Demo_Update] 
       ON  [dbo].[B_Demo_TB] 
       AFTER UPDATE
    AS 
    BEGIN
        SET NOCOUNT ON;
        DECLARE @NewData INT,@OldData INT;
    
        DECLARE cursorDel CURSOR FOR SELECT Data FROM DELETED
    
        DECLARE cursorINSERT CURSOR FOR SELECT Data FROM INSERTED
    
        open cursorDel
        open cursorINSERT
    
        FETCH NEXT FROM cursorDel INTO @OldData
    
        FETCH NEXT FROM cursorINSERT INTO @NewData
        
    
        WHILE @@FETCH_STATUS=0
            BEGIN
                IF(@OldData!=@NewData)
                BEGIN
                    INSERT INTO M_TriggleSoft(Data)
                    VALUES(@NewData)
                END
                FETCH NEXT FROM cursorDel INTO @OldData
    
                FETCH NEXT FROM cursorINSERT INTO @NewData
             END
        CLOSE cursorDel
        DEALLOCATE cursorDel
        CLOSE cursorINSERT
        DEALLOCATE cursorINSERT
    END

           既然明白了触发器中DELETE和INSERTED是两张虚表,那么其实上述的操作也可以这么来:

    ALTER TRIGGER [dbo].[Trigger_Demo_Update] 
       ON  [dbo].[B_Demo_TB] 
       AFTER UPDATE
    AS 
    BEGIN
        SET NOCOUNT ON;
        DECLARE @NewData INT,@OldData INT;
    
        SELECT @OldData=Data FROM DELETED
    
        SELECT @NewData=Data FROM INSERTED
    
                INSERT INTO M_TriggleSoft(DATA) SELECT Data FROM INSERTED INNER JOIN DELETED ON INSERTED.ID=DELETED.ID WHERE INSERTED.DATA=DELETED.DATA
            END
            
    END
  • 相关阅读:
    把本地的jar包安装到maven库中
    mybatis 查询
    freemarker
    python——线程相关
    【python-sql】sql操作时遇到的坑
    专项测试——移动app安装包检测
    【Android端 adb相关】adb相关总结
    for 语句
    Python2.x与3​​.x版本区别
    Python 运算符
  • 原文地址:https://www.cnblogs.com/xietong/p/6237288.html
Copyright © 2011-2022 走看看