我对 TB 进行UPDATE   UPDATE  TB  ZT='是'  WHERE  XF>'2012-12-21' AND  XF<'2012-12-31'  变更了100条记录;但是TB触发器只执行了一条记录,对应的表只变更一条。
请问, 如何办?
CREATE TRIGGER   TB_UPDATE  ON dbo.TB
FOR UPDATE
AS
declare  @NEW_ZT   char(2),@OLD_ZT  char(2),@YH CHAR(1)
SELECT @NEW_ZT=INSERTED.ZT  FROM  INSERTED
SELECT @OLD_ZT=DELETED.ZT   FROM  DELETED
SELECT @YH=INSERTED.YH  FROM  INSERTED
IF @OLD_ZT='否' and @NEW_ZT='是'
begin
    UPDATE YB  SET   FS=FS+1   WHERE   YH=@YH
end

解决方案 »

  1.   

    改触发器,不用变量,YB直接关联inserted/deleted
      

  2.   

    CREATE TRIGGER TB_UPDATE ON dbo.TB FOR UPDATE AS
    begin
      if exists(select 1 from inserted where ZT = '否') and exists(select 1 from deleted where zt = '是')
         UPDATE YB SET FS=FS+1 WHERE YH = (select yh from inserted)
    end
      

  3.   


    CREATE TRIGGER TB_UPDATE ON dbo.TB
    FOR UPDATE
    as
     update a 
     set a.FS=a.FS+1
     from YB a
     inner join inserted b on a.YH=b.YH
     where b.YH in
       (select c.YH 
        from deleted c
        inner join inserted d on c.YH=d.YH
        where c.ZT='否' and d.ZT='是'
       )
      

  4.   


    你这个触发器,肯定能做一个回补确认变更的过程。  但是用了两个 exists(select...)  会不会降低数据库性能, 让这项工作占用更多的资源
      

  5.   


    你这个也可以完成这个批量的UPDATE 触发。 但是,用到了 join   in(select     这样一来是不是大大的占用了资源?  如果这类触发事件是经常会发生的话,这个方法是不是不太好?
    还有更好的办法吗?
      

  6.   

    TB,YB表的YH字段上有索引的话,不会有问题.
      

  7.   


    你的意思是说, 在SQL企业管理器里,对这两个表的这个字段创建好索引了就行了?
      

  8.   


    UPDATE  表A  SET  YH=‘A’  WHERE  xxxxx表A 有多条记录受到这个UPDATE影响。  在触发器里对该YH字段变为A 有操作但是只对一条记录产生了操作。
      

  9.   

    触发器里用 cursor,把你的那段逻辑写在 遍历cursor里。