Я создал таблицу сопоставления на основе предложения OUTPUT
оператора MERGE
. Нет IDENTITY_INSERT
требуется.
В приведенном ниже примере есть RecordImportQueue
и RecordDataImportQueue
, а RecordDataImportQueue.RecordID
- от FK до RecordImportQueue.RecordID
. Данные в этих промежуточных таблицах должны идти в Record
и RecordData
, и FK должен быть сохранен.
RecordImportQueue to Record выполняется с помощью оператора MERGE
, производящего таблицу сопоставления из его OUTPUT
, а RecordDataImportQueue переходит к RecordData
, используя INSERT
из SELECT исходной таблицы, присоединенной к таблице сопоставления.
DECLARE @MappingTable table ([NewRecordID] [bigint],[OldRecordID] [bigint])
MERGE [dbo].[Record] AS target
USING (SELECT [InstanceID]
,RecordID AS RecordID_Original
,[Status]
FROM [RecordImportQueue]
) AS source
ON (target.RecordID = NULL) -- can never match as RecordID is IDENTITY NOT NULL.
WHEN NOT MATCHED THEN
INSERT ([InstanceID],[Status])
VALUES (source.[InstanceID],source.[Status])
OUTPUT inserted.RecordID, source.RecordID_Original INTO @MappingTable;
После этого вы можете вставить записи в справочную таблицу следующим образом:
INSERT INTO [dbo].[RecordData]
([InstanceID]
,[RecordID]
,[Status])
SELECT [InstanceID]
,mt.NewRecordID -- the new RecordID from the mappingtable
,[Status]
FROM [dbo].[RecordDataImportQueue] AS rdiq
JOIN @MappingTable AS mt
ON rdiq.RecordID = mt.OldRecordID
Хотя и после оригинального поста, я надеюсь, что это может помочь другим людям, и мне любопытны любые отзывы.