Published on

December 6, 2018

Comparando datos en tablas de SQL Server

Hay momentos en los que necesitamos comparar dos tablas y determinar si los datos coinciden. Si bien hay varias formas de lograr esto, algunas de ellas pueden ser lentas e ineficientes. En este artículo, exploraremos un método rápido y un poco sucio utilizando las funciones CHECKSUM y CHECKSUM_AGG en SQL Server.

La función CHECKSUM

La función CHECKSUM genera un valor de comprobación para una fila completa o una selección de columnas en una fila. Calcula un valor hash basado en los datos de las columnas especificadas.

La función CHECKSUM_AGG

Por otro lado, la función CHECKSUM_AGG genera un valor de comprobación para un conjunto de datos. Toma los valores de comprobación individuales de cada fila y los agrega en un solo valor de comprobación para toda la tabla.

Comparando tablas

Al combinar estas dos funciones, podemos comparar fácilmente los datos en dos tablas. Para hacer esto, primero necesitamos crear un valor de comprobación para cada tabla. Esto se puede lograr generando un valor de comprobación para cada fila utilizando CHECKSUM, y luego utilizando CHECKSUM_AGG para obtener un valor de comprobación agregado para toda la tabla.

Aquí tienes un ejemplo:

SELECT CHECKSUM_AGG(CHECKSUM(*)) 
FROM nombre_tabla

La consulta anterior devolverá un valor de comprobación para todos los datos en una tabla. Al ejecutar esta consulta para dos o más tablas, podemos comparar los valores de comprobación. Si los valores de comprobación coinciden, indica que los datos en esas tablas también coinciden.

Es importante tener en cuenta que tanto CHECKSUM como CHECKSUM_AGG generan sus valores de comprobación a través de la función hash. Esto significa que hay una posibilidad muy pequeña de que dos conjuntos de datos diferentes produzcan el mismo valor de comprobación. Sin embargo, el riesgo de colisiones de hash es extremadamente bajo.

Ejemplo

Vamos a ver este método en acción. Supongamos que tenemos dos copias de la tabla “Databases” de la base de datos “Undercover Catalogue” que queremos comparar.

SELECT CHECKSUM_AGG(CHECKSUM(*)) 
FROM SQLUndercover.Catalogue.Databases

Esta consulta devuelve un valor de comprobación de 811887081.

SELECT CHECKSUM_AGG(CHECKSUM(*)) 
FROM SQLUndercover.Catalogue.Databases2

Ejecutar la consulta anterior para la segunda tabla también devuelve un valor de comprobación de 811887081.

A partir de los resultados anteriores, podemos concluir que los datos en las dos tablas coinciden.

Solo por el bien del argumento, eliminemos una fila de una de las tablas y veamos qué sucede con el valor de comprobación.

DELETE FROM SQLUndercover.Catalogue.Databases 
WHERE ServerName = 'DavidSQLTest01'

Si volvemos a ejecutar la consulta de comprobación, obtenemos un valor de comprobación diferente de 175501893. Esto indica que los datos en las dos tablas ahora son diferentes.

En conclusión, el uso de las funciones CHECKSUM y CHECKSUM_AGG proporciona una forma rápida y eficiente de comparar datos en tablas de SQL Server. Si bien existe un riesgo muy bajo de colisiones de hash, es importante tener en cuenta esta posibilidad. En una publicación futura, podríamos profundizar en el tema de CHECKSUM y las colisiones de hash para explorar su prevalencia.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.