¿Cómo comparar los campos de dos tablas en distintas bases de datos en SQL Server 2008?

publicado por: Anonymous

He encontrado mucha información sobre este tema que coinciden en parte con lo que quiero, pero me han terminado por confundir.

Verán tengo en una base de datos (BD1) una tabla, digamos que se llama tablaOrigen y en una BD2 una tablaResumen, en esta última tabla solo se ha extraido registros de un intervalo de fecha determinado (ejemplo: 2009 al 2012), pero ya pasó un buen tiempo, me están pidiendo que compare todos los registros de la tablaResumen(en todos sus campos, que son mas de 60) con los de su origen en tablaOrigen. Quisera que me arroje las filas que cambiaron en alguno de sus campos y algo que me ayude a identificar los campos que originaron la modificación de las filas. Lo único que acabo de comprobar es que el numero de registros según la fecha coinciden en ambas tablas.

Una vez determinada las filas distintas o las que no se encuentran en la tabla “Resumen” mediante un EXCEPT (Primer proceso), y con un segundo procedimiento sobre este resultado para identificar los campos modificados, la respuesta que espero es mas o menos la siguiente:

Resultado con los campos identificados y que originaron los cambios en las filas:
introducir la descripción de la imagen aquí

Si es que es posible claro, solo poner los campos que se modificaron y los demás rellenarlos con un null.

O simplemente poner las columnas involucradas en las modificaciones de los campos como en el siguiente dibujo:

introducir la descripción de la imagen aquí

Aunque esto lo veo un poco más engorroso. No se me ocurre otra forma de mostrarles los campos modificados. Aunque ya me resigné a tener que copiar en el script las más de 60 columnas, creo que no hay otra forma.

solución

Con la siguiente consulta puedes ver la diferencia que ambas tablan tendrían:

SELECT *
FROM dbo.tablaOrigen o
FULL JOIN dbo.tablaResumen r
    ON o.codigo = r.codigo
WHERE o.fecha BETWEEN '20090101' AND '20121231'
AND (r.codigo IS NULL or o.codigo IS NULL);

Esto te entregará los resultados de datos que están en la tablaOrigen y no en tablaResumen para el período de tiempo que comentaste o viceversa.

ACTUALIZACIÓN

Según tu comentario, lo que necesitas es comparar todas las columnas de ambas tablas, para saber si han cambiado en el tiempo. Para esto, lo más sencillo es usar EXCEPT:

SELECT *
FROM BaseDatos1.dbo.tablaOrigen o
WHERE o.fecha BETWEEN '20090101' AND '20121231'
EXCEPT 
SELECT *
FROM BaseDatos2.dbo.tablaResumen r;

Esto asume que ambas tablas tienen exactamente la misma estructura de columnas. Si no fuera así, debes listar las columnas que quieres comparar:

SELECT col1, col2, col3, ....., col60
FROM dbo.tablaOrigen o
WHERE o.fecha BETWEEN '20090101' AND '20121231'
EXCEPT 
SELECT col1, col2, col3, ....., col60
FROM dbo.tablaResumen r;

ACTUALIZACIÓN 2

Ok, según tu nuevo requerimiento, lo que tendrías que hacer es lo siguiente:

SELECT  ISNULL(o.codigo,r.codigo) codigo,
        CASE
            WHEN ISNULL(r.col1,'') <> ISNULL(o.col1,'') THEN r.col1
        END col1,
        CASE
            WHEN ISNULL(r.col2,'') <> ISNULL(o.col2,'') THEN r.col2
        END col2,
        ........ -- repetir para cada columna de tu tabla
        CASE
            WHEN ISNULL(r.col60,'') <> ISNULL(o.col60,'') THEN r.col60
        END col60
FROM dbo.tablaOrigen o
FULL JOIN dbo.tablaResumen r
    ON o.codigo = r.codigo
WHERE o.fecha BETWEEN '20090101' AND '20121231'
AND (   r.codigo IS NULL 
        OR o.codigo IS NULL
        OR ISNULL(r.col1,'') <> ISNULL(o.col1,'') -- acá depende del tipo de datos de la columna
        OR ISNULL(r.col2,'') <> ISNULL(o.col2,'') 
        OR .........    -- repetir para cada columna de tu tabla
        OR ISNULL(r.col60,'') <> ISNULL(o.col60,''));
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *