sqlserver利用游标实现行级触发器

oracle实现行级触发器的方法是用for each row
SqlServer 触发器形成的交互数据分别存在系统临时表的inserted和deleted

要实现对这些数据集的行级操作,即一行行的取出来就需要游标(这是我的想法,有其他办法的大神请指教)
以下是我今天碰到的业务需求中做出来的触发器
游标的使用是对数据库性能造成负担的,所以慎用

--后记,此触发器真的造成数据库很卡,后来停掉改用其他方法了

  1. set ANSI_NULLS ON
  2. set QUOTED_IDENTIFIER ON
  3. go
  4.  
  5. ALTER TRIGGER [weixin] ON [dbo].[Study] 
  6. FOR  UPDATE
  7. AS
  8.  
  9. if(update(ReserveInt3))
  10. begin
  11.  
  12.   declare mycur cursor for 
  13.    select a.hospitalizedno "reportId", 
  14.                a.studypart "reportTitle", 
  15.                convert(varchar(10), reportDate ,120) "reportDate", 
  16.                b.name "patientName",
  17.                "bz",
  18.                a.hospitalizedno "healthCardNo"
  19.  
  20.         from inserted a
  21.              left join patient b on a.patientid=b.patientid
  22.              where convert(varchar(10), studydate , 120) = convert(varchar(10), GETDATE(), 120)   and a.reserveint3 > 6
  23.               
  24.   open mycur
  25.  
  26. declare @blh nvarchar(32),        
  27.         @reportId  nvarchar(32),
  28.         @reportTitle nvarchar(150),
  29.         @reportDate nvarchar(20),
  30.         @patientName varchar(20),
  31.         @bz nvarchar(5),
  32.         @healthCardNo  nvarchar(32)
  33.           
  34.     
  35.   fetch next from mycur into 
  36.         @reportId ,
  37.         @reportTitle ,
  38.         @reportDate ,
  39.         @patientName ,
  40.         @bz ,
  41.         @blh  
  42.   while(@@fetch_status=0)
  43.     begin
  44.  --跨数据库查询,通过病历号在HIS查到最新卡号
  45.        set @healthCardNo = (select top card_no from openquery(HIS,'select a.BLH as blh, b.fcardno as card_no from mzsf.mzys_tbs_jz_rec a,hthis.p_bhm_medicard b
  46.         where a.pat_id b.fpat_id order by a.xtrq desc') where blh = @blh )
  47.  
  48. --插入到微信临时表
  49.        insert into weixin_lsb values( @reportId ,
  50.         @reportTitle ,
  51.         @reportDate ,
  52.         @patientName ,
  53.         @bz ,
  54.         @healthCardNo )
  55.  
  56.          fetch next from mycur into 
  57.         @reportId ,
  58.         @reportTitle ,
  59.         @reportDate ,
  60.         @patientName ,
  61.         @bz ,
  62.         @blh  
  63.     end
  64.   close mycur
  65.   deallocate mycur
  66. end
  67.  
  68.  

posted on 2015-07-02 00:53  MaxGeek  阅读(331)  评论(0)    收藏  举报