CLAUSULA OUTPUT( inserted, deleted ) SIN TRIGGERS
CLAUSULA OUTPUT( inserted, deleted ) SIN TRIGGERS
Hola, 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:
1 | IF OBJECT_ID (N 'tablaPruebas' , N 'U' ) IS NOT NULL |
2 | DROP TABLE tablaPruebas |
3 |
4 | CREATE TABLE tablaPruebas ( |
5 | cve TINYINT |
6 | , nombre VARCHAR (30) |
7 | , fecha DATE |
8 | ) |
Ahora insertaremos unos datos y visualizaremos los datos insertados:
1 | INSERT INTO tablaPruebas |
2 | OUTPUT inserted.* |
3 | VALUES ( 1, 'PEDRO' , '20130101' ) |
4 | , ( 2 , 'JUAN' , '20130403' ) |
O también podemos utilizar nombrando los campos afectados:
1 | INSERT INTO tablaPruebas |
2 | OUTPUT inserted.cve, inserted.nombre, inserted.fecha |
3 | VALUES ( 1, 'PEDRO' , '20130101' ) |
4 | , ( 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:
01 | IF OBJECT_ID (N 'tablaPruebas' , N 'U' ) IS NOT NULL |
02 | DROP TABLE tablaPruebas |
03 |
04 | CREATE TABLE tablaPruebas ( |
05 | cve TINYINT |
06 | , nombre VARCHAR (30) |
07 | , fecha DATE |
08 | ) |
09 |
10 | DECLARE @varTabla TABLE ( cve TINYINT , nombre VARCHAR (30), fecha DATE ) |
11 |
12 | INSERT INTO tablaPruebas |
13 | OUTPUT inserted.cve, inserted.nombre, inserted.fecha |
14 | INTO @varTabla |
15 | VALUES ( 1, 'PEDRO' , '20130101' ) |
16 | , ( 2 , 'JUAN' , '20130403' ) |
17 |
18 | SELECT * FROM @varTabla WHERE cve = 1 |
Es posible también utilizarlo dentro de la clausula UPDATE de la siguiente manera:
1 | UPDATE tablaPruebas |
2 | SET nombre = 'LUIS' , fecha = '20101212' |
3 | OUTPUT inserted.*, deleted.* |
4 | WHERE cve = 2 |
De la misma forma, es posible almacenar en una variable para su uso posterior:
01 | IF OBJECT_ID (N 'tablaPruebas' , N 'U' ) IS NOT NULL |
02 | DROP TABLE tablaPruebas |
03 |
04 | CREATE TABLE tablaPruebas ( |
05 | cve TINYINT |
06 | , nombre VARCHAR (30) |
07 | , fecha DATE |
08 | ) |
09 |
10 | DECLARE @varTabla TABLE ( |
11 | cveINSERTED TINYINT , nombreINSERTED VARCHAR (30), fechaINSERTED DATE |
12 | , cveDELETED TINYINT , nombreDELETED VARCHAR (30), fechaDELETED DATE |
13 | ) |
14 |
15 | INSERT INTO tablaPruebas |
16 | VALUES ( 1, 'PEDRO' , '20130101' ) |
17 | , ( 2 , 'JUAN' , '20130403' ) |
18 |
19 | UPDATE tablaPruebas |
20 | SET nombre = 'LUIS' , fecha = '20101212' |
21 | OUTPUT inserted.*, deleted.* |
22 | INTO @varTabla |
23 | WHERE cve = 2 |
24 |
25 | SELECT * FROM @varTabla |
Ahora, con DELETE
01 | IF OBJECT_ID (N 'tablaPruebas' , N 'U' ) IS NOT NULL |
02 | DROP TABLE tablaPruebas |
03 |
04 | CREATE TABLE tablaPruebas ( |
05 | cve TINYINT |
06 | , nombre VARCHAR (30) |
07 | , fecha DATE |
08 | ) |
09 |
10 | DECLARE @varTabla TABLE ( cve TINYINT , nombre VARCHAR (30), fecha DATE ) |
11 |
12 | INSERT INTO tablaPruebas |
13 | VALUES ( 1, 'PEDRO' , '20130101' ) |
14 | , ( 2 , 'JUAN' , '20130403' ) |
15 |
16 | DELETE FROM tablaPruebas |
17 | OUTPUT deleted.* |
18 | INTO @varTabla |
19 | WHERE cve=1 |
20 |
21 | SELECT * FROM @varTabla |
Con MERGE INTO:
01 | IF OBJECT_ID (N 'tablaPruebas' , N 'U' ) IS NOT NULL |
02 | DROP TABLE tablaPruebas |
03 |
04 | CREATE TABLE tablaPruebas ( |
05 | cve TINYINT |
06 | , nombre VARCHAR (30) |
07 | , fecha DATE |
08 | ) |
09 |
10 | INSERT INTO tablaPruebas |
11 | VALUES ( 1, 'PEDRO' , '20130101' ) |
12 | , ( 2 , 'JUAN' , '20130403' ) |
13 |
14 | MERGE INTO tablaPruebas t |
15 | USING ( |
16 | SELECT 2 AS cve, 'LUIS' AS nombre, '20101212' AS fecha |
17 | UNION |
18 | SELECT 3 , 'ENRIQUE' , '20101103' |
19 | ) |
20 | AS s( cve, nombre, fecha ) |
21 | ON t.cve = s.cve |
22 | WHEN MATCHED THEN |
23 | UPDATE SET t.cve = s.cve , t.nombre = s.nombre , t.fecha = s.fecha |
24 | WHEN NOT MATCHED BY TARGET THEN |
25 | INSERT ( cve , nombre , fecha ) VALUES ( s.cve, s.nombre, s.fecha ) |
26 | WHEN NOT MATCHED BY SOURCE THEN |
27 | DELETE |
28 | OUTPUT $ action , inserted.*, deleted.* ; |
Y también es posible almacenarlo en una variable:
01 | IF OBJECT_ID (N 'tablaPruebas' , N 'U' ) IS NOT NULL |
02 | DROP TABLE tablaPruebas |
03 |
04 | CREATE TABLE tablaPruebas ( |
05 | cve TINYINT |
06 | , nombre VARCHAR (30) |
07 | , fecha DATE |
08 | ) |
09 |
10 | DECLARE @varTabla TABLE ( accion VARCHAR (20) , |
11 | cveINSERTED TINYINT , nombreINSERTED VARCHAR (30), fechaINSERTED DATE |
12 | , cveDELETED TINYINT , nombreDELETED VARCHAR (30), fechaDELETED DATE |
13 | ) |
14 | INSERT INTO tablaPruebas |
15 | VALUES ( 1, 'PEDRO' , '20130101' ) |
16 | , ( 2 , 'JUAN' , '20130403' ) |
17 |
18 | MERGE INTO tablaPruebas t |
19 | USING ( |
20 | SELECT 2 AS cve, 'LUIS' AS nombre, '20101212' AS fecha |
21 | UNION |
22 | SELECT 3 , 'ENRIQUE' , '20101103' |
23 | ) |
24 | AS s( cve, nombre, fecha ) |
25 | ON t.cve = s.cve |
26 | WHEN MATCHED THEN |
27 | UPDATE SET t.cve = s.cve , t.nombre = s.nombre , t.fecha = s.fecha |
28 | WHEN NOT MATCHED BY TARGET THEN |
29 | INSERT ( cve , nombre , fecha ) VALUES ( s.cve, s.nombre, s.fecha ) |
30 | WHEN NOT MATCHED BY SOURCE THEN |
31 | DELETE |
32 | OUTPUT $ action , inserted.*, deleted.* INTO @varTabla ; |
33 |
34 | SELECT * FROM @varTabla; |
Espero que les sirva de ayuda. SALUDOS.
Comentarios
Publicar un comentario