2011-01-27 124 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秒左右。