I have a table Items (ItemID, Name, ...) where ItemID is auto-generated identity
I want to add rows into this table FROM select on this same table. AND save into table variable the references between OriginalItemID and NewlyGeneratedID.
So I want it to look like the following:
DECLARE @ID2ID TABLE (OldItemID INT, NewItemID INT);
INSERT INTO Items OUTPUT Items.ItemID, INSERTED.ItemID INTO @ID2ID
SELECT * FROM Items WHERE Name = 'Cat';
BUT Items.ItemID
obviously does not work here. Is there a workaround to make OUTPUT take original ItemID from the SELECT statement?
If you are on SQL Server 2008+, you can use MERGE for getting both the current and the new ID. The technique is described in this question.
For your example the statement might look like this:
MERGE INTO
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
S.ItemID, INSERTED.ItemID INTO @ID2ID (OldItemID, NewItemID)
;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With