T-SQL: оригинальное значение INSERT в предложении OUTPUT - PullRequest
17 голосов
/ 20 мая 2011

У меня есть таблица Элементы (ItemID, Name, ...) , где ItemID - автоматически сгенерированная идентификация

Я хочу добавить строки в эту таблицуИЗ выберите на этой же таблице.И сохраните в табличную переменную ссылки между OriginalItemID и NewlyGeneratedID.

Поэтому я хочу, чтобы это выглядело следующим образом:

DECLARE @ID2ID TABLE (OldItemID INT, NewItemID INT);

INSERT INTO Items OUTPUT Items.ItemID, INSERTED.ItemID INTO @ID2ID
SELECT * FROM Items WHERE Name = 'Cat';

НО Items.ItemID, очевидно, здесь не работает.Есть ли обходной путь, чтобы OUTPUT принимал исходный ItemID из оператора SELECT?

1 Ответ

21 голосов
/ 20 мая 2011

Если вы используете SQL Server 2008+, вы можете использовать MERGE для получения как текущего, так и нового идентификатора.Техника описана в этом вопросе .

Для вашего примера утверждение может выглядеть так:

MERGE INTO
  Items AS t
USING
  (
    SELECT *
    FROM Items
    WHERE Name = 'Cat'
  ) AS s
ON
  0 = 1
WHEN NOT MATCHED BY TARGET THEN
  INSERT (<i>target_column_list</i>) VALUES (<i>source_column_list</i>)
OUTPUT
  S.ItemID, INSERTED.ItemID INTO @ID2ID (OldItemID, NewItemID)
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...