Подтвердить что ты не робот

T-SQL: исходное значение INSERT в предложении OUTPUT

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

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

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

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?

4b9b3361

Ответ 1

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

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

MERGE Items AS t
USING (
  SELECT *
  FROM Items
  WHERE Name = 'Cat'
) AS s
ON 0 = 1
WHEN NOT MATCHED BY TARGET THEN
  INSERT (target_column_list) VALUES (source_column_list)
OUTPUT INSERTED.ItemID, S.ItemID INTO @ID2ID (OldItemID, NewItemID);