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

      写给遇到同样问题的朋友

  • 相关阅读:
    硝烟中的Scrum和XP-我们如何实施Scrum 12)发布计划 13)组合XP
    php array key 的存储规则
    IE下单选按钮隐藏后点击对应label无法选中的bug解决
    使用QML自绘页面导航条
    unity 获取物体尺寸
    输出众数,输出超限问题
    HTTP请求具体解释
    app 设计原则 ,步骤
    Distinct Subsequences
    OSX: 禁止iCloud钥匙链?
  • 原文地址:https://www.cnblogs.com/xiaohouzixiashan/p/14318186.html
Copyright © 2011-2022 走看看