Sto scrivendo un'istruzione insert di elaborazione batch e vorrei utilizzare una tabella temporanea per tenere traccia degli ID inseriti anziché eseguire il ciclo degli elementi e chiamare SCOPE_IDENTITY () per ogni riga inserita.
I dati che devono essere inseriti hanno un ID (temporaneo) che li collega ad altri dati che dovrebbero anche essere inseriti in un'altra tabella, quindi ho bisogno di un riferimento incrociato tra l'ID effettivo e l'ID temporaneo.
Questo è un esempio di ciò che ho finora:
-- 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
Il problema è che non riesco a ottenere la clausola OUTPUT INTO per accettare l'ID, ho provato @MyInsertData.ID
e altri trucchi per unire la tabella a se stessa, ma nulla sembra funzionare.