MERGE en SQL Server para Insert, Delete y Update con dos tablas

0
724

Ejemplo práctico usando MERGE para sincronizar dos tablas, Insert, Update y Delete en un solo query. Válido para SQL SERVER 2008 o superior.

En un escenario típico de manejo de datos, es probable que tengamos que realizar cualquiera de las tres acciones (Insert, Update o Delete) sobre una tabla con los datos en otra.

En este ejemplo vamos a tomar como ejemplo un caso de Usuarios y Usuarios Actualizados, y como resultado nos va a dejar las dos tablas sincronizadas, tabla origen y tabla fuente. En un caso normal esto se tendría que hacer los 3 querys por separado, lo que significaría varias consultas y un select para verificar si el dato existe, otro para insertar otro para modificar y otro para borrar. Con MERGE, SQL Server nos permite hacer todo esto en una sola consulta, lo que es mucho más eficiente y utiliza muchísimo menos recursos en el servidor, más aun cuando las tablas son muy grandes.

NOTA: esto solo funciona en versiones SQL 2008 o superior.

La sintaxis de MERGE sería:

Si bien están todos los posibles escenarios no es requisito utilizarlas todas, o bien tampoco en el mismo orden o función que le daremos en este ejemplo, usted puede hacer lo que necesite.

La instrucción MERGE sincroniza los datos de un origen establecido en una tabla destino, basado en la condición (tipo “where”) que se indique y si estos datos desde el origen existen o no en el destino. Si los datos coinciden  por el primer filtro llega a la opción “WHEN MATCHED” donde aún ahí se le puede agregar otro filtro “WHEN MATCHED AND TARGET.Nombre <> SOURCE.Nombre” o “WHEN MATCHED AND TARGET.Puntos > 5”. Si los datos están en SOURCE pero no están en TARGET “WHEN NOT MATCHED BY TARGET THEN” o si los datos están en TARGET pero no en SOURCE “WHEN NOT MATCHED BY SOURCE THEN”.

Esto puede resultar muy útil a la hora de sincronizar datos no actualizados, o si queremos tener tablas de almacenamiento o archivo histórico, más aun si estas ya cuentan con muchos registros.

Para poner esto en práctica vamos a tomar un ejemplo de usuarios con un respectivo puntaje. Si estos usuarios han tenido cambios en su nombre o puntaje se actualizan, si el usuario es nuevo se inserta y si el usuario no ha tenido movimientos se borra de la tabla target.

Primero vamos a crear las tablas y datos de prueba.

 

Ahora vamos a utilizar MERGE para comparar las dos tablas y hacer las acciones correspondientes.

En el query tenemos una sección OUTPUT, esta es totalmente opcional y ahí podemos ver que acciones se tomó por cada línea afectada. Si bien también se podría usar para alguna tabla de bitácora o simplemente no usarla y solamente para cuando se hacen pruebas.

El resultado en output nos muestra línea por línea que acción tomó nuestro query, si actualizó, borró o insertó. Repetimos, esta sección es opcional.

 

Ahora el resultado de las dos tablas después de usar MERGE

Como podemos ver las dos tablas quedaron sincronizadas, se actualizaron los datos en la tabla TARGET y el usuario que no tenía movimientos de puntaje fue eliminado.

Este es un ejemplo pero los posibles escenarios que podemos tener son muchísimos, y las ventajas que nos da son mucho mayores. Espero que en algún momento esto les sea de utilidad.

Dejar respuesta

Please enter your comment!
Please enter your name here