J'écris une instruction d'insertion de traitement par lots et je voudrais utiliser une table temporaire pour garder une trace des ID insérés au lieu de parcourir les éléments moi-même et d'appeler SCOPE_IDENTITY () pour chaque ligne insérée.
Les données qui doivent être insérées ont des identifiants (temporaires) les reliant à d'autres données qui devraient également être insérées dans une autre table, j'ai donc besoin d'une référence croisée de l'identifiant réel et de l'identifiant temporaire.
Voici un exemple de ce que j'ai jusqu'à présent:
-- The existing table
DECLARE @MyTable TABLE (ID INT IDENTITY(1,1), [Name] NVARCHAR(MAX));
-- My data I want to insert
DECLARE @MyInsertData TABLE (ID INT, [Name] NVARCHAR(MAX));
INSERT INTO @MyInsertData ( ID,Name)
VALUES ( -1 , 'bla'),(-2,'test'),(-3,'last');
DECLARE @MyCrossRef TABLE ([NewId] INT, OldId INT);
INSERT INTO @MyTable ( [Name] )
OUTPUT Inserted.ID, INS.ID INTO @MyCrossRef
SELECT [NAME] FROM @MyInsertData INS
-- Check the result
SELECT * FROM @MyCrossRef
Le problème est que je ne peux pas obtenir la clause OUTPUT INTO pour accepter l'ID, j'ai essayé @MyInsertData.ID
et d'autres astuces joignant la table à elle-même, mais rien ne semble fonctionner.
la source
La clause de sortie ne peut accéder qu'aux données des lignes cibles et des constantes / variables, pas aux données provenant ailleurs dans la source
SELECT
, comme si vous fonctionniez dans un déclencheur.https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql indique:
Donc, pour obtenir l'ID d'origine, vous devez l'inclure dans la table de destination afin que la clause de sortie puisse le renvoyer, comme suit:
bien que la modification du schéma de l'objet cible puisse ne pas être pratique dans votre situation, cela peut ne pas être applicable.
la source