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?
Ответы
Ответ 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);