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:
1IF 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:

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

Comentarios

Entradas populares de este blog

Ejercicios para aprender AutoCAD 3D

Piezas 3D - interesantes

Cómo instalar una fuente de alimentación