Combine OUTPUT insert.id con el valor de la fila seleccionada
CorriendoSQL Server 2014
. ¿Cómo puedo insertar varias filas de una tabla y combinar los datos insertados con las nuevas ID?
¡Veamos un ejemplo simplificado!
DECLARE @Old TABLE
(
[ID] [int] PRIMARY KEY,
[Data] [int] NOT NULL
)
DECLARE @New TABLE
(
[ID] [int] PRIMARY KEY,
[OtherID] [int] NULL
)
INSERT INTO [dbo].[Test] ([Data])
OUTPUT inserted.[ID], [@Old].[ID] /* <--- not supported :( */ INTO @New
SELECT [Data]
FROM @Old
Necesito combinar las ID insertadas con los datos que se están insertando. ¿Puedo suponer que las filas insertadas están en el mismo orden que las filas seleccionadas? (No podré unirme a[Data]
después de la operación de inserción.)
Lo siguiente parece una posible solución, pero no puedo encontrar pruebas de que funcione. ¿Está garantizado para trabajar?
DECLARE @Old TABLE
(
[RowID] [int] PRIMARY KEY IDENTITY, -- Guaranteed insert order?
[ID] [int] NOT NULL,
[Data] [int] NOT NULL
)
DECLARE @New TABLE
(
[RowID] [int] PRIMARY KEY IDENTITY, -- Guaranteed insert order?
[ID] [int] NOT NULL,
[OtherID] [int] NULL
)
INSERT INTO [dbo].[Test] ([Data])
OUTPUT inserted.[ID] INTO @New
SELECT [Data]
FROM @Old
ORDER BY [RowID]
El truco aquí es usar unidentity
columna yORDER BY
para las filas seleccionadas, y luegounirse a RowID
.