Augusto Humire Martinez web blog

algo de web-in

Obtener identity de un insert masivo o por lotes con output

Alguna vez hemos necesitado registrar valores en la tabla masivamente o por lotes para hacer un registro mucho mas rapido, pero ocurre si la tabla destino tiene un identity definida en la llave primaria?

Se puede obtener los identity de forma masiva tambien?
La respuesta es si, esto se logra con OUTPUT este commando nos puede retornar los campos las filas insertadas, aicionalmente un pequeño artilugio y voila, tenemos todos los indentity generados de un solo golpe.

Este es un ejemplo de como funcionaria

Cree las siguientes tablas y llene tantos valores considere necesario a la tabla DailyEvent, la otra tabla Incident puede dejarla vacia (es la tabla destino, la que contiene los identity a capturar)

—————————————————————————-
CREATE TABLE [dbo].[DailyEvent](
[Location] [varchar](100) NULL,
[Type] INT DEFAULT 0,
[ClientId] [varchar](100) NULL,
[TimeEvent] [varchar](100) NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Incident](
[IncidentId] [int] IDENTITY(1,1) PRIMARY KEY
[Location] [varchar](100) NULL,
[Type] [int] NULL,
[ClientId] [varchar](100) NULL,
[TimeEvent] [varchar](100) NULL,
[Guid] [varchar](100) NULL
)
GO
—————————————————————————-

Luego de llenar la tabla DailyEvent (la que contendria los datos origen en su proyecto)

ejecute el siguiente script y verá que la tabla #TEMPORAL_TABLE contiene todos Identity que se registraron en la tabla Incident, luego de ello haga los Ud desee con los datos que tiene en #TEMPORAL_TABLE, al fin y al cabo los tiene todos alli incluyendo los Id generados masivamente.

—————————————————————————-
IF object_id(‘tempdb..#TEMPORAL_TABLE’) IS NOT NULL
BEGIN
DROP TABLE #TEMPORAL_TABLE;
END

SELECT
0 AS IncidentId
,Location
,Type
,ClientId
,TimeEvent
,NEWID() AS Guid
INTO #TEMPORAL_TABLE
FROM DailyEvent DE
WHERE Type = 2 –CRASH CAR

DECLARE @pivotTable TABLE (IncidentId INT, Guid VARCHAR(100))

INSERT INTO Incident
(
Location
,Type
,ClientId
,TimeEvent
,Guid
)
OUTPUT inserted.IncidentId, inserted.Guid
INTO @pivotTable
SELECT
Location
,Type
,ClientId
,TimeEvent
,Guid
FROM #TEMPORAL_TABLE

UPDATE TT SET
TT.IncidentId = PP.IncidentId
FROM #TEMPORAL_TABLE AS TT
INNER JOIN @pivotTable AS PP ON PP.Guid = TT.Guid

SELECT * FROM #TEMPORAL_TABLE
—————————————————————————-

Voila.

mayo 10, 2018 - Posted by | Uncategorized

1 comentario »

  1. Muchas gracias, me ha sido muy util.

    Comentario por claudioquezada | marzo 12, 2020


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s

A %d blogueros les gusta esto: