Hola, como pudimos observar en el
post TABLAS
INSERTED, DELETED EN TRIGGERS, es posible obtener los valores de las
operaciones UPDATE, INSERT, DELETE en Trigger, pero no solo eso, a continuación
les mostraré que también es posible obtener dicho valores a través de la
clausula OUTPUT desde estas operaciones y sin la necesidad de utilizar un
TRIGGER.
Comenzaremos creando nuestra tabla:
IF OBJECT_ID (N'tablaPruebas', N'U') IS NOT NULL DROP TABLE tablaPruebas CREATE TABLE tablaPruebas ( cve TINYINT , nombre VARCHAR(30) , fecha DATE )
Ahora insertaremos unos datos y
visualizaremos los datos insertados:
INSERT INTO tablaPruebas OUTPUT inserted.* VALUES( 1, 'PEDRO' , '20130101' ) , ( 2 , 'JUAN', '20130403' )
O también podemos utilizar nombrando los campos afectados:
INSERT INTO tablaPruebas OUTPUT inserted.cve, inserted.nombre, inserted.fecha VALUES( 1, 'PEDRO' , '20130101' ) , ( 2 , 'JUAN', '20130403' )
En cualquiera de los dos casos, el
resultado será el siguiente sin la necesidad de ejecutar un SELECT:
Podemos almacenar el resultado de
la clausula OUTPUT en una variable para su posterior uso, como el ejemplo a
continuación donde solo obtenemos una fila:
IF OBJECT_ID (N'tablaPruebas', N'U') IS NOT NULL DROP TABLE tablaPruebas CREATE TABLE tablaPruebas ( cve TINYINT , nombre VARCHAR(30) , fecha DATE ) DECLARE @varTabla TABLE ( cve TINYINT, nombre VARCHAR(30), fecha DATE ) INSERT INTO tablaPruebas OUTPUT inserted.cve, inserted.nombre, inserted.fecha INTO @varTabla VALUES( 1, 'PEDRO' , '20130101' ) , ( 2 , 'JUAN', '20130403' ) SELECT * FROM @varTabla WHERE cve = 1
Es posible también utilizarlo
dentro de la clausula UPDATE de la siguiente manera:
UPDATE tablaPruebas SET nombre = 'LUIS' , fecha = '20101212' OUTPUT inserted.*, deleted.* WHERE cve = 2
De la misma forma, es posible almacenar
en una variable para su uso posterior:
IF OBJECT_ID (N'tablaPruebas', N'U') IS NOT NULL DROP TABLE tablaPruebas CREATE TABLE tablaPruebas ( cve TINYINT , nombre VARCHAR(30) , fecha DATE ) DECLARE @varTabla TABLE ( cveINSERTED TINYINT, nombreINSERTED VARCHAR(30), fechaINSERTED DATE , cveDELETED TINYINT, nombreDELETED VARCHAR(30), fechaDELETED DATE ) INSERT INTO tablaPruebas VALUES( 1, 'PEDRO' , '20130101' ) , ( 2 , 'JUAN', '20130403' ) UPDATE tablaPruebas SET nombre = 'LUIS' , fecha = '20101212' OUTPUT inserted.*, deleted.* INTO @varTabla WHERE cve = 2 SELECT * FROM @varTabla
Ahora, con DELETE
IF OBJECT_ID (N'tablaPruebas', N'U') IS NOT NULL DROP TABLE tablaPruebas CREATE TABLE tablaPruebas ( cve TINYINT , nombre VARCHAR(30) , fecha DATE ) DECLARE @varTabla TABLE ( cve TINYINT, nombre VARCHAR(30), fecha DATE ) INSERT INTO tablaPruebas VALUES( 1, 'PEDRO' , '20130101' ) , ( 2 , 'JUAN', '20130403' ) DELETE FROM tablaPruebas OUTPUT deleted.* INTO @varTabla WHERE cve=1 SELECT * FROM @varTabla
Con MERGE INTO:
IF OBJECT_ID (N'tablaPruebas', N'U') IS NOT NULL DROP TABLE tablaPruebas CREATE TABLE tablaPruebas ( cve TINYINT , nombre VARCHAR(30) , fecha DATE ) INSERT INTO tablaPruebas VALUES( 1, 'PEDRO' , '20130101' ) , ( 2 , 'JUAN', '20130403' ) MERGE INTO tablaPruebas t USING ( SELECT 2 AS cve, 'LUIS' AS nombre, '20101212' AS fecha UNION SELECT 3 , 'ENRIQUE' , '20101103' ) AS s( cve, nombre, fecha ) ON t.cve = s.cve WHEN MATCHED THEN UPDATE SET t.cve = s.cve , t.nombre = s.nombre , t.fecha = s.fecha WHEN NOT MATCHED BY TARGET THEN INSERT ( cve , nombre , fecha ) VALUES( s.cve, s.nombre, s.fecha ) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $action, inserted.*, deleted.* ;
Y también es posible almacenarlo
en una variable:
IF OBJECT_ID (N'tablaPruebas', N'U') IS NOT NULL DROP TABLE tablaPruebas CREATE TABLE tablaPruebas ( cve TINYINT , nombre VARCHAR(30) , fecha DATE ) DECLARE @varTabla TABLE ( accion VARCHAR(20) , cveINSERTED TINYINT, nombreINSERTED VARCHAR(30), fechaINSERTED DATE , cveDELETED TINYINT, nombreDELETED VARCHAR(30), fechaDELETED DATE ) INSERT INTO tablaPruebas VALUES( 1, 'PEDRO' , '20130101' ) , ( 2 , 'JUAN', '20130403' ) MERGE INTO tablaPruebas t USING ( SELECT 2 AS cve, 'LUIS' AS nombre, '20101212' AS fecha UNION SELECT 3 , 'ENRIQUE' , '20101103' ) AS s( cve, nombre, fecha ) ON t.cve = s.cve WHEN MATCHED THEN UPDATE SET t.cve = s.cve , t.nombre = s.nombre , t.fecha = s.fecha WHEN NOT MATCHED BY TARGET THEN INSERT ( cve , nombre , fecha ) VALUES( s.cve, s.nombre, s.fecha ) WHEN NOT MATCHED BY SOURCE THEN DELETE OUTPUT $action, inserted.*, deleted.* INTO @varTabla ; SELECT * FROM @varTabla;
Espero que les sirva de ayuda. SALUDOS.
COMPARTE ESTA INFORMACION SI TE PARECIO INTERESANTE
0 comentarios:
Publicar un comentario