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.