【日常排雷】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

  写给遇到同样问题的朋友

posted @ 2021-01-23 17:06  小猴子下山  阅读(257)  评论(0编辑  收藏  举报