Cuando aplicamos una sentencia delete sobre algunos registros, a menudo es necesario saber cuales son los que hemos borrado.
¿Cómo obtener mensajes de salida que nos devuelvan información sobre, lo que se ha borrado de nuestra tabla?
Continuando con los capítulos de Insert y update, ahora vamos a probar con Delete.
Imagen de PublicDomainPictures en Pixabay
Definición
Claúsula Output en Insert | Datos y demás
Devuelve información de las filas afectadas por una instrucción INSERT, UPDATE, DELETE o MERGE, o expresiones basadas en esas filas. Estos resultados se pueden devolver a la aplicación de procesamiento para que los utilice en mensajes de confirmación, archivado y otros requisitos similares de una aplicación.
https://docs.microsoft.com/es-es/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-ver15
Escenario
-- Code 1.0
Create table dbo.deleteOutput
(
id int identity(1, 1) primary key
, fecha datetime2 default getdate()
, valor varchar(100)
);
Ahora generamos un código para insertar lineas diferentes en la tabla.
La primera columna es identitaria por tanto se genera sola. La segunda columna tiene un valor por defecto, por tanto se cubrirá sola. La tercera columna, vamos a generar una secuencia de números ordenada (1, 2, 3…..xxxxx), desde 1 hasta un montón.
-- Code 1.1
With c1 as (
Select 1 as n
From sys.objects c
Cross join sys.objects d
), c2 as (
Select Row_number() over(order by n) as row
From c1)
Insert into dbo.deleteOutput (valor)
Select CAST(c2.row as varchar(100))
from c2;
Si te resulta un poco extraño el código, puedes mirar como se realiza en este enlace. Generar secuencias de filas
-- Code 1.2
Select d.id
, d.fecha
, d.valor
from dbo.deleteOutput d
order by d.id desc;
Ahora tenemos rellena la tabla con un montón de filas. Vamos a probar si output puede generar la salida de la sentencia de borrado de las que ya que se procesan en la misma sentencia.
Prueba 1 Borrar y mostrar lo que se ha borrado
Usando la clausula output y la pseudo tabla deleted, tenemos el contenido integro borrado.
-- Code 1.3
delete
from dbo.deleteOutput
output deleted.*
where id > 10;
Y el resultado, nos muestra lo que tenemos.
Deleted dispone de todas las columnas de la tabla, por tanto no es obligatorio mostrarlas todas, podríamos mostrar las que queramos.
-- Code 1.4
Delete From dbo.deleteOutput
Output deleted.valor
Where id between 1 and 3;
Prueba 2 Borrar y recoger en un conjunto lo borrado
Declaramos una variable tipo tabla. Luego hacemos la sentencia de borrado y usando output, insertamos los valores en la variable antes creada. Por ultimo mostramos desde la variable de tabla el contenido que se ha borrado.
-- Code 1.4
Declare @TableOutput table
(
id int
, fecha datetime2
, valor varchar(10)
);
Delete From dbo.deleteOutput
Output Deleted.*
Into @TableOutput
Where id between 5 and 10;
Select *
from @TableOutput;
Por tanto en vez de mostrar o además de mostrar el contenido, dispondríamos de la información y podríamos utilizarla en otras sentencias posteriores.
😉