2011-01-27 27 views
5

私は特定のテーブルにレコードを挿入するSQL Serverで作業しています。(a)、このテーブルには2つの列[ID(IDフィールド)と名前(nvarchar(max)]レコードがテーブル(a)に挿入された後、トリガが起動し、テーブルbのIDフィールド値を挿入する必要があります。この目的のために挿入トリガを使用していますが、私は、トリガのIDフィールドの値を取得することでしょう...表Bに挿入される。SQL Server 2008の挿入トリガーの後に動作する方法

これは私が

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

を使用していますものですできるだけ早く返信してください。.. おかげで、よろしく アッバスElectricwala

+0

SQL IDを取得する方法とそれぞれの動作については、この質問を参照してください。http://stackoverflow.com/questions/42648/best-way-to-get-identity-of-inserted-row – nybbler

+0

@nybbler:これは実際の挿入時に。 INSERTトリガーでは、INSERTEDテーブル – gbn

答えて

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

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

をお返事ありがとうございます。 – Abbas

6

@gbnは、最善の解決策を持っているが、私は、SELECT句がトリガーにVALUES句を使用するよりも優れている理由を理解したいです。挿入/更新/削除されたレコードの各バッチに対して起動をトリガーします。したがって、挿入された疑似可能オブジェクトまたは削除された疑似オブジェクトは、1つのレコードを持つことがあります。トリガーはいずれの場合も扱うことができなければならない。値節を使用すると、100万人のうちの1つのレコードに対してのみアクションが発生します。これは、データの完全性の問題をもたらす。カーソル内のレコードをループしてVALUES句を使用すると、多数のレコードを取得するとパフォーマンスが低下します。私がこの仕事に就いたとき、そのようなトリガが1つありました.4万レコードの挿入を挿入するのに45分かかりました。カーソルを削除し、SELECT句に基づく集合ベースの解法を使用すると(例よりはるかに複雑ですが)、同じ挿入の時間が約40秒に短縮されました。

関連する問題