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

      写给遇到同样问题的朋友

  • 相关阅读:
    数据结构-串的堆分配存储
    ServerSocket
    Java-坦克大战
    Java-输入输出流
    MyEclipse 快捷键
    数据结构-串的定长顺序存储
    我的软考资料集合
    软考中级软件设计师考试大纲
    2016年第一季度阅读书目
    中国大陆开源镜像网站汇总
  • 原文地址:https://www.cnblogs.com/xiaohouzixiashan/p/14318186.html
Copyright © 2011-2022 走看看