2012-02-03 6 views
2

このトリガー:INSTEAD OFトリガーをSCOPE_IDENTITYと連携させる方法はありますか?

ALTER TRIGGER InsteadTrigger on CustomerView 
INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO Person 
     SELECT FirstName, LastName 
     FROM inserted 

は、このクエリはnullを返すようにします。

INSERT INTO CustomerView (FirstName, LastName) Values ('Jonathan', 'Allen') 
SELECT SCOPE_IDENTITY() 

トリガーを修正してSCOPE_IDENTITYが正しい値を返す方法はありますか? (@@ IDENTITYを使用することはできません。なぜなら、関係するテーブルに他のトリガーがある可能性があるからです。)

+0

P.S.私の顧客はこれについて尋ねています。私は意図的にこのような状況に陥ることはありません。 –

+0

最初に、INSERTが1行しか処理しないと想定するという非常に一般的なエラーを作ります。 1つのinsert文で複数の行を挿入することができます。 –

+1

いいえ私はそうではありません。トリガーは複数の行に対して機能し、SCOPE_IDENTITYが1つだけ挿入されている場合を除き、誰もその操作を期待しません。 –

答えて

3

いいえこれは可能ではないと思います。

もちろん、トリガー自体から返すこともできます。

ALTER TRIGGER InsteadTrigger on CustomerView 
INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO Person 
     SELECT FirstName, LastName 
     FROM inserted 

     SELECT SCOPE_IDENTITY() AS PersonId 
END 

そして、あなたはあなたがそれを必要とする場合を除いて、結果セットを抑制するためにCONTEXT_INFOを使用することができます。

this Microsoft Connect Itemで説明されているように、OUTPUT節はこのコンテキストでは機能しません。これは、メインテーブルに挿入される前、つまりIDENTITY関数が呼び出される前に評価されます。

+0

これは素晴らしいことではありません。現時点では、これは彼らが望むことができる最高のものだと私は信じています。 –

関連する問題