最近对接一个老系统,需要在老系统数据发生改变时,对新系统数据进行更新。
于是在老系统的数据库(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
写给遇到同样问题的朋友