Estou escrevendo uma instrução de inserção de processamento em lote e gostaria de usar uma tabela temporária para controlar os IDs inseridos em vez de fazer um loop entre os itens e chamar SCOPE_IDENTITY () para cada linha inserida.
Os dados que precisam ser inseridos têm IDs (temporários) vinculando-os a outros dados que também devem ser inseridos em outra tabela. Por isso, preciso de uma referência cruzada do ID real e do ID temporário.
Este é um exemplo do que tenho até agora:
-- 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
O problema é que não consigo que a cláusula OUTPUT INTO aceite o ID, tentei @MyInsertData.ID
e outros truques unindo a tabela a ela mesma, mas nada parece funcionar.