2011-06-29 5 views
2

テーブルに新しいレコードを作成する際に、2つのテーブル(bとc)のそれぞれにレコードを作成する必要があります。そのトリックは、2つの新しいレコードが同じPK値を持つ必要があることです。これはUNIQUEIDENTIFIERでなければならず、したがってNEWID()を使用して生成され、元のレコードのキーとは関係しません。INSERTトリガのOUTPUT句では、両方のINSERTEDテーブルを参照できますか?

INSERT INTO [b] ([bKey], [Foo]) 
OUTPUT inserted.[bKey] [cKey], i.[Bar] INTO [c] 
SELECT NEWID(), i.[Foo] FROM inserted i 

しかし、これは違法であると思われる(In an OUTPUT clause in an INSTEAD OF INSERT trigger, is it possible to reference both INSERTED tables?):だから、私はINSERTトリガーでやりたいことは、このようになります。 NEWID()の結果にCURSORと変数を使用する以外にこれを行う方法はありますか?

答えて

1

は、私はあなたがあなたの目標を達成するために、テーブル変数/一時テーブルを使用することができると思う:出力句のinserted擬似テーブル以外のテーブルを参照することはできませんINSERT文の

DECLARE @tmp TABLE (
    [bKey] …, 
    [Foo] …, 
    [Bar] … 
); 

INSERT INTO @tmp ([bKey], [Foo], [Bar]) 
SELECT NEWID(), [Foo], [Bar] FROM inserted; 

INSERT INTO [b] ([bKey], [Foo]) 
SELECT [bKey], [Foo] FROM @tmp; 

INSERT INTO [c] ([cKey], [Bar]) 
SELECT [bKey], [Bar] FROM @tmp; 
+0

ありがとう、アンドリー!私は恐ろしいCURSORよりも洗練されたソリューションがなければならないことを知っていました。 –

3

OUTPUT clause - 見ますfrom_table_name上の注意事項:

は、テーブルが更新または削除する行を指定するために使用されるDELETE、UPDATEのFROM句、またはMERGE文の中に含ま指定する列の接頭辞です。

関連する問題