2011-01-27 103 views
5

我正在使用sql服务器,我想在特定表中插入记录说(一),此表包含两列[id(标识字段)和名称(nvarchar(max)]现在在记录被插入到表(a)后,触发器应该触发并在表b中插入标识字段值....我在插入触发器后用于此目的,但我没有得到如何我会得到在触发标识字段值......应在b表插入。如何在sql server 2008中插入触发器后使用

这是我使用

create trigger tri_inserts on (a) 
after insert 
as 
begin 
    insert into b (id, name) values (?,?) 
end 

请尽快回复可能是什么.. 感谢和问候 阿巴斯Electricwala

+0

看到这个问题关于如何获得SQL身份以及每个行为如何:http://stackoverflow.com/questions/42648/best-way-to-get-identity-of-inserted-row – nybbler 2011-01-27 18:49:42

+0

@nybbler:这是在实际插入。在INSERT触发器中,您可以阅读INSERTED表 – gbn 2011-01-27 18:52:12

回答

12
create trigger tri_inserts on a 
after insert 
as 
set nocount on 

insert into b (id, name) 
    SELECT id, name FROM INSERTED 
GO 
6

@gbn有最好的解决办法,但我希望你能理解为什么在SELECT子句比在触发使用VALUES子句更好。触发器触发插入/更新/删除的每批记录。所以插入的伪指令或删除的伪指令可能有一条记录,或者它们可能有一百万条记录。触发器必须能够处理这两种情况。如果您使用值条款,您只能获得百万条记录中的一条记录。这导致了数据完整性问题。如果您决定遍历游标中的记录并使用VALUES子句,那么当您获得大量记录时,您的性能将会非常糟糕。当我来找这份工作时,我们有一个这样的触发器,花了45分钟来插入一个40,000个记录插入。删除游标并使用基于SELECT语句的基于集合的解决方案(虽然比示例复杂得多)将相同插入的时间缩短到40秒左右。