J'ai créé une table de mappage basée sur la clause OUTPUT
de l'instruction MERGE
. Non IDENTITY_INSERT
requis. Dans l'exemple ci-dessous, il y a RecordImportQueue
et RecordDataImportQueue
et RecordDataImportQueue.RecordID
est un FK à RecordImportQueue.RecordID
. Les données dans ces tables de transfert doivent aller à Record
et RecordData
, et FK doit être conservé.
RecordImportQueue à enregistrement se fait en utilisant une instruction MERGE
, la production d'une table de correspondance de son OUTPUT
et RecordDataImportQueue va à l'aide d'un RecordData
INSERT
d'un SELECT de la table source jointe à la table de correspondance.
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;
Après cela, vous pouvez insérer les enregistrements dans une table de référence comme folows:
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
Bien que longtemps après le message original, j'espère que cela peut aider d'autres personnes, et je suis curieux Tous les commentaires.
Comment cela fonctionnerait-il si la table cible contient déjà des données? – Daniel
lorsque vous créez l'identité sur la table de mappage, définissez le germe de sorte qu'il ne soit pas en conflit avec les données existantes. –
[Cet article MSDN] (http://msdn.microsoft.com/en-us/library/ms175098.aspx) indique: 'Soyez prudent lorsque vous utilisez IDENT_CURRENT pour prédire la prochaine valeur d'identité générée. La valeur générée réelle peut être différente de IDENT_CURRENT plus IDENT_INCR en raison des insertions effectuées par d'autres sessions. Existe-t-il un moyen d'éviter de manière fiable les valeurs d'identité conflictuelles? – Daniel