在INSERT触发器的OUTPUT子句中,是否可以引用两个INSERTED表?

时间:2011-06-29 15:33:57

标签: sql-server sql-server-2005 triggers insert

在表中创建新记录时,我需要在另外两个表(b和c)中创建一个记录。诀窍是两个新记录需要具有相同的PK值,它必须是UNIQUEIDENTIFIER,因此使用NEWID()生成并且与原始记录的密钥无关。所以,我想在INSERT TRIGGER中做的事情看起来像这样:

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?)。有没有办法做到这一点,除了使用CURSOR和变量作为NEWID()的结果?

2 个答案:

答案 0 :(得分:3)

INSERT语句的OUTPUT clause不能引用输出子句的inserted伪表以外的任何表 - 请参阅from_table_name上的注释:

  

是一个列前缀,用于指定DELETE,UPDATE或MERGE语句的FROM子句中包含的表,该语句用于指定要更新或删除的行。

答案 1 :(得分:1)

我认为您可以使用表变量/临时表来实现目标:

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;