sqlserver利用游标实现行级触发器
oracle实现行级触发器的方法是用for each row
SqlServer
触发器形成的交互数据分别存在系统临时表的inserted和deleted中
要实现对这些数据集的行级操作,即一行行的取出来就需要游标(这是我的想法,有其他办法的大神请指教)
以下是我今天碰到的业务需求中做出来的触发器
游标的使用是对数据库性能造成负担的,所以慎用
--后记,此触发器真的造成数据库很卡,后来停掉改用其他方法了
-
set
ANSI_NULLS ON -
set
QUOTED_IDENTIFIER ON -
go
-
-
ALTER
TRIGGER [weixin] ON [dbo].[Study] -
FOR
UPDATE -
AS
-
-
if(update(ReserveInt3))
-
begin
-
-
declaremycur cursor for -
selecta.hospitalizedno "reportId", -
a.studypart"reportTitle", -
convert(varchar(10),reportDate ,120) "reportDate", -
b.name"patientName", -
"bz",0 -
a.hospitalizedno"healthCardNo" -
-
frominserted a -
leftjoin patient b on a.patientid=b.patientid -
whereconvert(varchar(10), studydate , 120 )= convert(varchar(10), GETDATE(), 120 ) anda.reserveint3 > 6 -
-
openmycur -
-
declare
@blh nvarchar(32), -
@reportId nvarchar(32), -
@reportTitlenvarchar(150), -
@reportDatenvarchar(20), -
@patientNamevarchar(20), -
@bznvarchar(5), -
@healthCardNo nvarchar(32) -
-
-
fetchnext from mycur into -
@reportId, -
@reportTitle, -
@reportDate, -
@patientName, -
@bz, -
@blh -
while(@@fetch_status=0) -
begin -
--跨数据库查询,通过病历号在HIS查到最新卡号 -
set@healthCardNo = (select top 1 card_nofrom openquery(HIS,'select a.BLH as blh, b.fcardno as card_no from mzsf.mzys_tbs_jz_rec a,hthis.p_bhm_medicard b -
)where a.pat_id = b.fpat_id order by a.xtrq desc' where blh = @blh ) -
-
--插入到微信临时表
-
insertinto weixin_lsb values( @reportId , -
@reportTitle, -
@reportDate, -
@patientName, -
@bz, -
@healthCardNo) -
-
fetchnext from mycur into -
@reportId, -
@reportTitle, -
@reportDate, -
@patientName, -
@bz, -
@blh -
end -
closemycur -
deallocatemycur -
end
-
-
浙公网安备 33010602011771号