Claúsula Output en Delete. ¿Qué registros se han borrado en una sentencia?


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.

😉


Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.