La Clausula Output nos permite leer de las pseudo-tablas inserted y deleted para extraer información, sobre lo que ha acontecido en un registro. De deleted podemos saber lo que contenía el registro justo antes de realizar la sentencia para la fila en la que estamos, y de inserted, como se ha quedado el valor.
Si podemos recuperar los valores, insertarlos en una variable tipo tabla, también podemos en una tabla temporal, ¿Insertarlos directamente en una tabla temporal?
Se crea una tabla de #TEMP, para anotar todo lo que ocurra en la tabla original. Escenario típico que a veces realizamos con un trigger, o con un versionado de tabla.
CREATE TABLE Articulos (ID int PRIMARY KEY, Descripcion varchar(25), Precio decimal(10,2));
GO
INSERT INTO Articulos (ID, Descripcion, Precio)
VALUES (1,'Articulo Amarillo',10),
(2,'Articulo Rojo',25.25),
(3,'Articulo Verde',24.2),
(4,'Articulo Marron',44);
CREATE TABLE #Temp (Old_ID int , New_ID int ,
Old_Precio decimal(10,2) , New_Precio decimal(10,2) ,
Old_Descripcion varchar(25), New_Descripcion varchar(25),
Mensaje varchar(100));
UPDATE A
SET Precio = 11 OUTPUT deleted.id AS Old_ID,
inserted.id AS ID,
deleted.precio AS Old_Precio,
inserted.precio AS Precio,
deleted.descripcion AS Old_Descripcion,
inserted.descripcion AS Descripcion,
'Modificación de registro' AS Mensaje INTO #Temp
FROM Articulos A WHERE ID = 2;
INSERT INTO Articulos
OUTPUT inserted.ID, inserted.Descripcion, inserted.Precio , 'Nuevo Registro'
INTO #Temp (New_ID, New_Descripcion, New_Precio, Mensaje)
VALUES (5,'Articulo Naranja',2.4), (6,'Articulo Morado',6.25);
SELECT * FROM #Temp
DROP TABLE Articulos
DROP TABLE #Temp
Si ejecutamos el código el resultado seria:
1.- Tabla Articulo con los primeros 4 INSERT
2.- Table Articulo + INSERT + UPDATE
3.- Tabla Temporal con el Historial de Cambios
Siguiendo esta fórmula se puede adaptar a varias necesidades. Aún así, si tienes problemas para realizar la inserción o bien, quieres que revisemos tu código para ayudarte me puedes contactar.
Leave a Reply