OUTPUT, inserted y deleted: observar las filas modificadas

Después de insertar, actualizar o eliminar datos, a menudo necesitamos conocer las filas realmente afectadas. OUTPUT devuelve valores de las imágenes lógicas inserted y deleted como parte de la misma instrucción. Una imagen lógica es una representación temporal de las filas antes o después del cambio; no es una tabla almacenada por separado.

inserted representa los valores nuevos; deleted, los anteriores. En un UPDATE podemos consultar ambos para ver el cambio.

Recuperar una identidad insertada

INSERT INTO dbo.Categoria
(
    Nombre,
    Activa
)
OUTPUT
    inserted.IdCategoria,
    inserted.Nombre
VALUES
(
    N'Accesorios',
    1
);

El resultado procede de la fila insertada y evita ejecutar después una búsqueda independiente para recuperar sus valores.

Comparar valores antes y después

En este ejemplo, ROUND(expresión, 2) redondea el nuevo precio a dos posiciones decimales. OUTPUT no realiza ese cálculo: únicamente permite observar el valor anterior y el resultado que produjo el UPDATE.

UPDATE dbo.Producto
SET Precio = ROUND(Precio * 1.05, 2)
OUTPUT
    inserted.IdProducto,
    deleted.Precio AS PrecioAnterior,
    inserted.Precio AS PrecioNuevo
WHERE IdCategoria = 2
  AND Activo = 1;

Cada fila actualizada produce una fila de salida. No debemos asumir un orden determinado para ese resultado.

Capturar la salida en una tabla

DECLARE @Cambios TABLE
(
    IdProducto INT,
    PrecioAnterior DECIMAL(12, 2),
    PrecioNuevo DECIMAL(12, 2)
);

UPDATE dbo.Producto
SET Precio = ROUND(Precio * 1.05, 2)
OUTPUT
    inserted.IdProducto,
    deleted.Precio,
    inserted.Precio
INTO @Cambios
(
    IdProducto,
    PrecioAnterior,
    PrecioNuevo
)
WHERE IdCategoria = 2
  AND Activo = 1;

SELECT
    IdProducto,
    PrecioAnterior,
    PrecioNuevo
FROM @Cambios
ORDER BY IdProducto;

OUTPUT ... INTO permite utilizar los cambios en pasos posteriores del mismo lote, el grupo de instrucciones enviado junto a SQL Server. Puede servir para auditoría controlada —un registro de qué cambió y cuándo—, integración o verificación, siempre que el diseño considere la transacción completa.

Qué imagen existe en cada operación

Instrucción inserted deleted
INSERT Fila nueva No disponible
UPDATE Valores nuevos Valores anteriores
DELETE No disponible Fila eliminada

Estas tablas lógicas también aparecen dentro de disparadores, el código que SQL Server ejecuta automáticamente ante ciertas operaciones, y pueden contener muchas filas. La lógica nunca debe asumir que se modificó una sola.

No confundir dos usos de OUTPUT

El parámetro OUTPUT de un procedimiento devuelve un valor mediante una variable. La cláusula OUTPUT de una instrucción DML devuelve o captura filas afectadas. DML reúne instrucciones que modifican datos, como INSERT, UPDATE y DELETE. Comparten la palabra, pero resuelven problemas diferentes.

Qué conviene comprobar

La salida puede contener filas aunque la instrucción encuentre un error y posteriormente sea revertida. Si la operación falla, no usamos esas filas como confirmación de persistencia.

También revisamos disparadores, columnas calculadas, restricciones y el destino de OUTPUT ... INTO. Para auditorías duraderas necesitamos diseñar permisos, transacciones y manejo de errores, no limitar la solución a copiar filas.

Relacionado con