Una guía para principiantes de la cláusula de SALIDA en SQL Server

T-SQL admite la cláusula OUTPUT después del inicio del servidor SQL 2005 y ediciones posteriores. Podemos usar la cláusula OUTPUT con sentencias DML (INSERT, DELETE, UPDATE) para devolver información de las filas modificadas.

Principalmente utilizamos la cláusula OUTPUT para auditar y archivar filas modificadas. En este tutorial, analizaremos el uso de la cláusula OUTPUT con diferentes declaraciones y ejemplos DML. Primero, crearemos una tabla, dbo.Songs, y poblarlo con algunos datos.

SI OBJECT_ID ('dbo.Songs') NO ES UNA TABLA DE GOTA NULA dbo.Songs IR CREAR TABLA dbo.Songs (Id int. RESTRA PK_Songs_Id CLAVE PRIMARIA, Nombre varchar (200) NOT NULL, Singer varchar (50) NOT NULL) GO INSERT INTO dbo.Songs (Id, Name, Singer) VALUES (1, "Odio todo acerca de ti", "Adam Gontier"); INSERTAR EN dbo.Songs (Id, Name, Singer) VALUES (2, 'Dil se', 'A. R. Rahman'); INSERTAR EN dbo.Songs (Id, Name, Singer) VALUES (3, 'My heart will On', 'Celine Dion'); INSERTAR EN dbo.Songs (Id, Name, Singer) VALUES (4, 'Maeri', 'Euphoria'); GO SELECT * de dbo.Songs GO



Tablas insertadas y eliminadas en una cláusula de SALIDA

Las tablas insertadas y eliminadas son dos tablas residentes en la memoria que residen dentro del servidor SQL y se usan con la cláusula OUTPUT.

Cada vez que se ejecuta una declaración DML (INSERT, DELETE, UPDATE), estas tablas se llenan.

Los resultados de la instrucción INSERT se almacenan en la tabla Insertada, y los resultados de la instrucción Eliminar se almacenan en la tabla Eliminada. Además, con una instrucción UPDATE, las filas eliminadas se almacenan en la tabla Eliminada. Las nuevas filas insertadas en la tabla Insertada como ACTUALIZACIÓN no son más que eliminar e insertar operaciones combinadas juntas.

Nota: no puede consultar directamente las tablas insertadas y eliminadas para ver qué datos están almacenando actualmente, pero puede usarlas con la cláusula OUTPUT así como con los activadores.


La cláusula de salida con una declaración de inserción

Cuando hacemos una operación de inserción en una tabla, recibimos un mensaje que dice "(n filas afectadas)," pero si queremos ver qué filas de datos se insertaron en una tabla, podemos usar una cláusula de SALIDA y una tabla insertada residente en la memoria para devolver los resultados a la pantalla de la misma manera que lo hace una declaración de selección.

Insertemos un registro y usemos una cláusula de SALIDA para imprimir los resultados en la pantalla.

INSERTAR EN dbo.Songs (Id, Name, Singer) OUTPUT INSERTED.ID, INSERTED.name, INSERTED.Singer VALUES (5, 'AINT no grave', 'Johnny Cash'); IR


Compruebe la tabla dbo.Songs. Se inserta una nueva fila con id = 5.

seleccione * de dbo.Songs; IR



La cláusula de salida con una declaración de eliminación

Lo mismo ocurre con una operación de borrado. Muestra solo (n filas afectadas). Podemos usar una cláusula OUTPUT y una tabla eliminada para ver qué filas se eliminaron realmente de la tabla.

ELIMINAR de dbo.Songs SALIDA DELETED.id, DELETED.name, DELETED.singer WHERE ID = 5; IR


Consulta la fila de la tabla dbo.Songs con id = 5 se ha eliminado.

seleccione * de dbo.Songs; IR



La cláusula de salida con una declaración de actualización

Una declaración de actualización no hace más que eliminar los datos antiguos e insertar nuevos datos, por lo que con una declaración de actualización, ambas tablas residentes en la memoria se ven afectadas y se eliminan, así como se insertan.

Aquí estamos actualizando el nombre de un cantante, que ha cantado la canción 'Dil se', con ID igual a dos.

ACTUALIZAR dbo.Songs SET Singer = 'Rahman' OUTPUT DELETED.Singer, INSERTED.Singer WHERE ID = 2; IR


Puede ver el nombre del cantante antiguo junto con el nombre del cantante nuevo.

seleccione * de dbo.Songs;


Los tres ejemplos anteriores muestran cómo utilizar una cláusula OUTPUT para fines de auditoría. Ahora, veremos cómo usarlo para archivar.

Antes, solo estábamos imprimiendo los resultados de una declaración DML en la pantalla, que era temporal, pero con la cláusula OUTPUT, también puede almacenar los resultados de una declaración DML en una tabla.


Almacenar los resultados de una cláusula de salida en una tabla

Insertar el retorno de datos de una cláusula OUTPUT en una tabla se puede hacer usando una cláusula OUTPUT INTO. Tenga en cuenta que primero debe crear la tabla de destino que debe tener el mismo número de columnas y tipos de datos que coincidan con la tabla de origen.

SI OBJECT_ID ('dbo.Songs_Inserted') NO ES UNA TABLA DE GOTA NULA dbo.Songs_Inserted IR CREAR TABLA dbo.Songs_Inserted (Id int CONSTRAINT PK_Songs__Inserted_Id CLAVE PRIMARIA, Nombre varchar (200) NOT NULL, Singer varchar dbo.Songs (Id, Nombre, Cantante) SALIDA Insertada. * INTO dbo.Songs_Inserted VALUES (5, 'Duniya', 'Piyush Mishra'); GO - Resultado de la tabla Songs_Inserted y de la tabla base. seleccione * desde dbo.Songs_Inserted; seleccione * de dbo.Songs; IR


Como muestran los resultados anteriores, los datos se insertan en ambas tablas.


Almacenar los resultados de una cláusula de salida en una tabla temporal

Lo mismo ocurre con una tabla temporal. Primero cree una tabla temporal y luego, utilizando una cláusula OUTPUT INTO, inserte los datos devueltos por la cláusula OUTPUT en una tabla temporal.

SI OBJECT_ID ('tempdb… #Songs_Deleted') NO ES UNA TABLA DE GOTA NULA dbo. # Songs_Deleted GO CREATE TABLE dbo. # Songs_Deleted (Id int, Nombre varchar (200) NOT NULL, Singer varchar (50) NOT NULL) GO DELETE de dbo .Songs OUTPUT eliminado. * INTO dbo. # Songs_Deleted WHERE ID IN (4,5); GO - Resultado de tabla temporal y tabla base. SELECT * from dbo. # Songs_Deleted; Seleccione * desde dbo.Songs;



Almacenar los resultados de una cláusula de salida en una variable de tabla

Nada cambia para las variables de la tabla también. Declare una estructura de variable de tabla igual que una tabla de origen. No olvide ejecutar el script completo a la vez para que pueda ver el resultado insertado en una variable de tabla.

Declare @Songs_Deleted TABLE (Id int, Nombre varchar (200) NOT NULL, Singer varchar (50) NOT NULL) ELIMINAR de dbo.Songs OUTPUT eliminado. * INTO @Songs_Deleted WHERE ID IN (1,2); - Resultado de la variable de tabla SELECT * de @Songs_Deleted;


Navegue a través de nuestros artículos del archivo del servidor SQL para obtener más información útil.