Извлечение исходного и нового сопоставления идентификаторов из оператора SELECT INSERT с помощью предложения OUTPUT
У меня есть таблица с двумя столбцами:
CREATE TABLE MyTable(
Id int IDENTITY(1,1) NOT NULL,
Name nvarchar(100) NOT NULL);
Я хочу дублировать данные с помощью инструкции SELECT INSERT:
INSERT INTO MyTable (Name)
SELECT Name FROM MyTable
и вот часть хитрости - я хочу получить таблицу сопоставления между исходным идентификатором и новым идентификатором:
DECLARE @idsMap TABLE (OriginalId int, NewId int)
Я знаю, что я предполагаю использовать предложение OUTPUT, но по какой-то причине это не работает:
INSERT INTO MyTable (Name)
OUTPUT t.Id, INSERTED.Id INTO @idsMap (OriginalId, NewId)
SELECT Name FROM MyTable t
-- Returns error The multi-part identifier "t.Id" could not be bound.
Смежные вопросы:
Может ли SQL-вставка с использованием select вернуть несколько идентификаторов?
Можно вставить с параметром таблицы, а также получить значения идентичности?
2 ответа
Это может быть достигнуто с помощью MERGE INTO
а также OUTPUT
:
MERGE INTO MyTable AS tgt
USING MyTable AS src ON 1=0 --Never match
WHEN NOT MATCHED THEN
INSERT (Name)
VALUES (src.Name)
OUTPUT
src.Id,
inserted.Id
INTO @idsMap;
Как насчет простого добавления нового столбца в MyTable? Вы можете держать его так долго, сколько вам нужно для анализа или чего-то еще. Я должен сказать, что создание копии таблицы мне кажется немного неуместным, но решать вам.
Нечто подобное может сработать для вас.
alter table MyTable
add OldID int null;
INSERT INTO MyTable (Name, OldID)
SELECT Name , Id
FROM MyTable t
select * from MyTable