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.
fonte
A cláusula de saída pode acessar apenas dados nas linhas e constantes / variáveis de destino, e não dados de outros lugares na origem
SELECT
, como se você estivesse operando em um gatilho.https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql afirma:
Portanto, para obter o ID original, você deve incluí-lo na tabela de destino para que a cláusula de saída possa repetir o processo da seguinte forma:
embora alterar o esquema do objeto de destino possa não ser prático em sua situação, isso pode não ser aplicável.
fonte