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 | IFOBJECT_ID(N'tablaPruebas', N'U') ISNOTNULL | 
| 2 |  DROPTABLEtablaPruebas | 
| 3 | 
| 4 |  CREATETABLEtablaPruebas (  | 
| 5 |  cve TINYINT | 
| 6 |  , nombre VARCHAR(30) | 
| 7 |  , fecha DATE | 
| 8 | ) | 
Ahora insertaremos unos datos y visualizaremos los datos insertados:
| 1 | INSERTINTOtablaPruebas | 
| 2 | OUTPUTinserted.* | 
| 3 | VALUES( 1, 'PEDRO', '20130101')  | 
| 4 | , ( 2 , 'JUAN', '20130403') | 
O también podemos utilizar nombrando los campos afectados:
| 1 | INSERTINTOtablaPruebas | 
| 2 | OUTPUTinserted.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 | IFOBJECT_ID(N'tablaPruebas', N'U') ISNOTNULL | 
| 02 |  DROPTABLEtablaPruebas | 
| 03 | 
| 04 |  CREATETABLEtablaPruebas (  | 
| 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 | INSERTINTOtablaPruebas | 
| 13 | OUTPUTinserted.cve, inserted.nombre, inserted.fecha | 
| 14 | INTO@varTabla | 
| 15 | VALUES( 1, 'PEDRO', '20130101')  | 
| 16 | , ( 2 , 'JUAN', '20130403') | 
| 17 | 
| 18 | SELECT* FROM@varTabla WHEREcve = 1  | 
Es posible también utilizarlo dentro de la clausula UPDATE de la siguiente manera:
| 1 | UPDATEtablaPruebas | 
| 2 | SETnombre = 'LUIS', fecha = '20101212' | 
| 3 | OUTPUTinserted.*, deleted.* | 
| 4 | WHEREcve = 2 | 
De la misma forma, es posible almacenar en una variable para su uso posterior:
| 01 | IFOBJECT_ID(N'tablaPruebas', N'U') ISNOTNULL | 
| 02 |  DROPTABLEtablaPruebas | 
| 03 | 
| 04 |  CREATETABLEtablaPruebas (  | 
| 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 | INSERTINTOtablaPruebas | 
| 16 | VALUES( 1, 'PEDRO', '20130101')  | 
| 17 | , ( 2 , 'JUAN', '20130403') | 
| 18 | 
| 19 | UPDATEtablaPruebas | 
| 20 | SETnombre = 'LUIS', fecha = '20101212' | 
| 21 | OUTPUTinserted.*, deleted.* | 
| 22 | INTO@varTabla | 
| 23 | WHEREcve = 2 | 
| 24 | 
| 25 | SELECT* FROM@varTabla | 
Ahora, con DELETE
| 01 | IFOBJECT_ID(N'tablaPruebas', N'U') ISNOTNULL | 
| 02 |  DROPTABLEtablaPruebas | 
| 03 | 
| 04 |  CREATETABLEtablaPruebas (  | 
| 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 | INSERTINTOtablaPruebas | 
| 13 | VALUES( 1, 'PEDRO', '20130101')  | 
| 14 | , ( 2 , 'JUAN', '20130403') | 
| 15 | 
| 16 | DELETEFROMtablaPruebas | 
| 17 | OUTPUTdeleted.* | 
| 18 | INTO@varTabla | 
| 19 | WHEREcve=1 | 
| 20 | 
| 21 | SELECT* FROM@varTabla | 
Con MERGE INTO:
| 01 | IFOBJECT_ID(N'tablaPruebas', N'U') ISNOTNULL | 
| 02 |  DROPTABLEtablaPruebas | 
| 03 | 
| 04 |  CREATETABLEtablaPruebas (  | 
| 05 |  cve TINYINT | 
| 06 |  , nombre VARCHAR(30) | 
| 07 |  , fecha DATE | 
| 08 | ) | 
| 09 | 
| 10 | INSERTINTOtablaPruebas | 
| 11 | VALUES( 1, 'PEDRO', '20130101')  | 
| 12 | , ( 2 , 'JUAN', '20130403') | 
| 13 | 
| 14 | MERGEINTOtablaPruebas t | 
| 15 | USING(  | 
| 16 |  SELECT2 AScve, 'LUIS'ASnombre, '20101212'ASfecha  | 
| 17 |  UNION | 
| 18 |  SELECT3 , 'ENRIQUE', '20101103' | 
| 19 | )  | 
| 20 | ASs( cve, nombre, fecha ) | 
| 21 | ONt.cve = s.cve | 
| 22 | WHENMATCHEDTHEN | 
| 23 |  UPDATESETt.cve = s.cve , t.nombre = s.nombre , t.fecha = s.fecha | 
| 24 | WHENNOTMATCHEDBYTARGET THEN | 
| 25 |  INSERT( cve , nombre , fecha ) VALUES( s.cve, s.nombre, s.fecha )  | 
| 26 | WHENNOTMATCHEDBYSOURCE THEN | 
| 27 |  DELETE | 
| 28 | OUTPUT$action, inserted.*, deleted.* ; | 
Y también es posible almacenarlo en una variable:
| 01 | IFOBJECT_ID(N'tablaPruebas', N'U') ISNOTNULL | 
| 02 |  DROPTABLEtablaPruebas | 
| 03 | 
| 04 |  CREATETABLEtablaPruebas (  | 
| 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 | INSERTINTOtablaPruebas | 
| 15 | VALUES( 1, 'PEDRO', '20130101')  | 
| 16 | , ( 2 , 'JUAN', '20130403') | 
| 17 | 
| 18 | MERGEINTOtablaPruebas t | 
| 19 | USING(  | 
| 20 |  SELECT2 AScve, 'LUIS'ASnombre, '20101212'ASfecha  | 
| 21 |  UNION | 
| 22 |  SELECT3 , 'ENRIQUE', '20101103' | 
| 23 | )  | 
| 24 | ASs( cve, nombre, fecha ) | 
| 25 | ONt.cve = s.cve | 
| 26 | WHENMATCHEDTHEN | 
| 27 |  UPDATESETt.cve = s.cve , t.nombre = s.nombre , t.fecha = s.fecha | 
| 28 | WHENNOTMATCHEDBYTARGET THEN | 
| 29 |  INSERT( cve , nombre , fecha ) VALUES( s.cve, s.nombre, s.fecha )  | 
| 30 | WHENNOTMATCHEDBYSOURCE 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