最近项目中遇到一个问题,在嵌套insert游标的时候,要求copy insert的数据到一个transaction table
发现如果在使用
insert table select * from table1 union select * from table2 的时候,数据库触发器只执行一次 ,也就是说,transaction table中只保存最后一条记录,不会保存2条记录。
查了一下MSDN,mssql 只有表级触发器和库级触发器。似乎这样是做不到类似oracle中的for each row 的效果了
仔细想一下,mssql在dml操作后,会生成一个inserted和deleted 临时表,这个表中无论你操作几次数据都会存在。
在任何一个查询sql中,都是一个隐式游标,所以要记录数据的时候,使用这2个临时表,就会达到类似行级触发器的效果了。
测试insert
---插入transaction 表
INSERT INTO tb_trans_history
(
trans_id,
trans_no,
trans_type,
trans_seq,
trans_pro_id,
trans_from,
trans_to,
create_by,
create_date
)(SELECT dbo.Fn_TXN_Id() ,input_id,trans_type,input_seq,input_pro_id,0,input_pro_qty,create_by,create_date FROM INSERTED)