В предложении OUTPUT в триггере INSERT можно ли ссылаться на обе таблицы INSERTED? - PullRequest
3 голосов
/ 29 июня 2011

При создании новой записи в таблице мне нужно создать запись в каждой из двух других таблиц (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

Однако это кажется недопустимым ( В предложении OUTPUT в триггере INSTEAD OF INSERT можно ли ссылаться на обе таблицы INSERTED? ). Есть ли способ сделать это, кроме как с помощью CURSOR и переменной для результата NEWID ()?

Ответы [ 2 ]

3 голосов
/ 30 июня 2011

Предложение OUTPUT оператора INSERT не может ссылаться ни на какие таблицы, кроме псевдотаблицы inserted предложения output - см. Примечания по from_table_name:

Префикс столбца, который задает таблицу, включенную в предложение FROM инструкции DELETE, UPDATE или MERGE, которая используется для указания строк, которые нужно обновить или удалить.

1 голос
/ 30 июня 2011

Я думаю, что вы можете использовать переменную таблицы / временную таблицу для достижения вашей цели:

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;
...