Извлечение исходного и нового сопоставления идентификаторов из оператора 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
Другие вопросы по тегам