2014/05/15

CLAUSULA OUTPUT( inserted, deleted ) SIN TRIGGERS

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