Estoy escribiendo una declaración de inserción de procesamiento por lotes y me gustaría utilizar una tabla temporal para realizar un seguimiento de las ID insertadas en lugar de recorrer los elementos yo mismo y llamar a SCOPE_IDENTITY () para cada fila insertada.
Los datos que deben insertarse tienen ID (temporales) que lo vinculan con otros datos que también deberían insertarse en otra tabla, por lo que necesito una referencia cruzada del Id real y el Id temporal.
Este es un ejemplo de lo que tengo hasta ahora:
-- 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
El problema es que no puedo obtener la cláusula OUTPUT INTO para aceptar la ID, lo he intentado @MyInsertData.ID
y otros trucos que unen la tabla, pero parece que nada funciona.
fuente
La cláusula de salida solo puede acceder a datos en las filas de destino y constantes / variables, no a datos de otras partes de la fuente
SELECT
, como si estuviera operando en un disparador.https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql afirma:
Por lo tanto, para obtener la ID original, deberá incluirla en la tabla de destino para que la cláusula de salida pueda repetirla, así:
aunque alterar el esquema del objeto de destino puede no ser práctico en su situación, por lo que esto puede no ser aplicable.
fuente