有两个表:A和B
A中列有name,pv,lo,ll,hi,hh
B表结构 name,pv,type
要求一触发器:当表A 的pv列更新时,
若pv>hh,将type设为“高高限”
若hi<pv<hh,将type设为“高限”
若pv<ll,将type设为“低低限”
若ll<pv<lo,将type设为“低限”
并将对应的name,pv值写入B表若用触发器调用一个完成此功能的存储过程更新速度非常慢
因此请教这个触发器怎么写
或者不用触发器有没有更好的提高更新速度的办法
我编程用的是vc

解决方案 »

  1.   

    create trigger aa on B
    for update
    as 
      if update(pv)
    begin
     update A set type=(case when pv>hh then '高高限'
     case when hi<pv<hh then '高限'
     case when pv<ll then  '低低限'
     case when ll<pv<lo then 低限'
     end) from inserted
     update B set B.name=A.name AND B.pv=A.pv from A,inserted
    end
      

  2.   

    create trigger update_column on a
    for update 
    as 
        if (COLUMNS_UPDATED() = 2)
        begin
        insert into b 
        select name , pv , 
          CASE pv
             WHEN pv>hh THEN '高高限'
             WHEN hi<pv<hh THEN '高限'
             WHEN pv<ll THEN '低低限'
             WHEN ll<pv<lo THEN '低限'
          END
        from a
       end 
    )
      

  3.   

    create trigger update_column on a
    for update 
    as 
        if (COLUMNS_UPDATED() = 2)
        begin
        insert into b 
        select name , pv , 
          CASE pv
             WHEN pv>hh THEN '高高限'
             WHEN hi<pv<hh THEN '高限'
             WHEN pv<ll THEN '低低限'
             WHEN ll<pv<lo THEN '低限'
          END
        from inserted
       end 
    )
      

  4.   

    --如果A和B表通过name关联:
    CREATE TRIGGER Tr_BUpd ON dbo.[A] 
    FOR UPDATE
    AS
    if update(pv)
    begin
       update B
       set type=(case when b.pv>b.hh then '高高限' when b.pv>b.hi and b.pv<=b.hh then '高限' when b.pv>b.ll and b.pv<=b.lo then '低限' else '低低限' end)
       from B a ,inserted b where a.name=b.name
    end
      

  5.   

    --如果A和B表通过name关联:
    CREATE TRIGGER Tr_BUpd ON dbo.[A] 
    FOR UPDATE
    AS
    if update(pv)
    begin
       update a
       set type=(case 
         when b.pv>b.hh then '高高限' 
         when b.pv>b.hi and b.pv<=b.hh then '高限' 
         when b.pv>b.ll and b.pv<=b.lo then '低限' 
         else '低低限' end)
       from B a ,inserted b where a.name=b.name
    end
      

  6.   

    CREATE TRIGGER TR_A_INSERT_UPDATE
    ON A
    FOR INSERT,UPDATE
    ASUPDATE B
     SET TYPE=CASE WHEN I.pv>I.hh THEN '高高限'
         WHEN I.pv<I.hh AND I.pv>I.HI THEN '高限'
         WHEN I.pv<I.LL THEN '低低限'
         WHEN I.pv>I.LL AND I.pv<I.LO THEN '低限'
         ELSE B.TYPE
         END
    FROM B,INSERTED I
    WHERE B.NAME=I.NAME
    AND B.PV=I.PVINSERT B
    SELECT NAME,PV,TYPE=CASE WHEN I.pv>I.hh THEN '高高限'
         WHEN I.pv<I.hh AND I.pv>I.HI THEN '高限'
         WHEN I.pv<I.LL THEN '低低限'
         WHEN I.pv>I.LL AND I.pv<I.LO THEN '低限'
         ELSE '不知'
         END
    FROM INSERTED I
    WHERE NOT EXISTS (
    SELECT 1 FROM B
    WHERE B.NAME=I.NAME
    AND B.PV=I.PV
    )GO--说明
    --1、你的逻辑有漏洞,lo<pv<hi没说明,都用><会楼掉有些数据点
    --2、我理解你的B表以(name,pv)为主键
      

  7.   

    --如果A和B表通过name关联:
    CREATE TRIGGER Tr_BUpd ON dbo.[A] 
    FOR UPDATE
    AS
    if update(pv)
    begin
      delete from B where name in (select name from inserted)
      insert into B select name,pv ,type=(case  when pv>hh then '高高限' when pv>hi and pv<=hh then '高限'      when pv>ll and pv<=lo then '低限'   else '低低限' end)   from inserted
    end
    哈哈,把貓大哥的方法改一改,不知對不對
      

  8.   

    可能是我没说明白
    补充一下:hh,hi,lo,ll分别表示上下限值,name,pv不是表B的主键,
    B中的name可以有重复值,我要求的只是在表A的pv值超限的情况下,将超限记录导入表B