zoukankan      html  css  js  c++  java
  • 【日常排雷】SQL SERVER 2000 批量处理时 触发器怎么写

      最近对接一个老系统,需要在老系统数据发生改变时,对新系统数据进行更新。

      于是在老系统的数据库(SQL SERVER 2000)表上加了个触发器,当数据发生改变时,将变更数据写入临时表。

      再通过定时程序去读取临时表,拉取数据对新系统进行更新。

      结果发现,当批量updata时,触发器永远只写入第一条,后面发现是触发器问题

      原来SQL SERVER 2000 的触发器,需要自己写循环,这说起来有点鸡肋了。。。

      下面是批量处理时,触发器写法代码:

    BEGIN
         -- 申明变量
        declare @vcno varchar(50),@old_vcno varchar(50),@vcck varchar(50),@old_vcck varchar(50),@vcac varchar(50),@old_vcac varchar(50)
         -- 申明游标,存储变更后的数据(inserted 存储的)
         declare  newDataCursor  cursor local for SELECT vcNo,ISNULL(vcCheck,''),ISNULL(vcAccount,'') from inserted;
         -- 打开游标
         open  newDataCursor;
            -- 拿取游标的下一条数据
            fetch  next  from  newDataCursor  into  @vcno,@vcck,@vcac
            -- 循环
            while (@@fetch_status=0)
            begin
                -- 查询 变更前的数据(deleted 里面存储的),vcNo 为表的主键
                SELECT @old_vcno=vcNo,@old_vcck=ISNULL(vcCheck,''),@old_vcac=ISNULL(vcAccount,'') from deleted where  vcNo=@vcno;
                -- 判断,当某列值发生改变时(你的业务逻辑)
                IF ( @vcck != @old_vcck or  @vcac != @old_vcac )
                BEGIN
                    -- 写入临时表
                    insert into temp_sync_info(data_type,data_id,sync_num,status,next_sync_date) VALUES('SH',@vcno, 1,'none',GETDATE());
                END
                -- 拿取游标的下一条数据
                fetch  next  from  newDataCursor  into  @vcno,@vcck,@vcac
           end
         -- 关闭游标
         close newDataCursor;
         -- 释放游标
         DEALLOCATE newDataCursor;
    END

      写给遇到同样问题的朋友

  • 相关阅读:
    Redis源码剖析之字典(dict)
    Redis源码剖析之跳表(skiplist)
    面试题精选:神奇的斐波那契数列
    awk实现类sql的join操作
    [翻译]CAP理论及其证明
    今年是冷冬?我爬了北京10年的气温,哟 还真是!
    python 等间隔抽取一定数量的数据
    操作系统-第十章-文件系统
    操作系统-第九章-虚拟内存管理
    操作系统-第八章-内存管理
  • 原文地址:https://www.cnblogs.com/xiaohouzixiashan/p/14318186.html
Copyright © 2011-2022 走看看