sql >> Base de Datos >  >> RDS >> Sqlserver

Diferentes formas de comparar esquemas y datos de tablas de SQL Server

SQL Server nos proporciona diferentes soluciones para replicar o archivar una tabla o tablas de una base de datos en otra base de datos, o en la misma base de datos con nombres diferentes. Como desarrollador de SQL Server o administrador de bases de datos, es posible que se enfrente a situaciones en las que necesite comprobar que los datos de estas dos tablas sean idénticos y, si, por error, los datos no se replican entre estas dos tablas, deberá sincronizar los datos. entre las mesas. Además, si recibe un mensaje de error que interrumpe el proceso de sincronización o replicación de datos debido a las diferencias de esquema entre las tablas de origen y de destino, debe encontrar una manera fácil y rápida de identificar las diferencias de esquema, ALTERAR las tablas para hacer el esquema es idéntico en ambos lados y reanudar el proceso de sincronización de datos.

En otras situaciones, necesita una manera fácil de obtener la respuesta SÍ o NO, si los datos y el esquema de dos tablas son idénticos o no. En este artículo, repasaremos las diferentes formas de comparar los datos y el esquema entre dos tablas. Los métodos provistos en este artículo compararán tablas que están alojadas en diferentes bases de datos, que es el escenario más complicado, y también se pueden usar fácilmente para comparar las tablas ubicadas en la misma base de datos con diferentes nombres.

Antes de describir los diferentes métodos y herramientas que se pueden usar para comparar los datos y esquemas de las tablas, prepararemos nuestro entorno de demostración creando dos nuevas bases de datos y creando una tabla en cada base de datos, con una pequeña diferencia de tipo de datos entre estas dos tablas, como se muestra en las instrucciones CREATE DATABASE y CREATE TABLE T-SQL a continuación:

CREATE DATABASE TESTDB
CREATE DATABASE TESTDB2
CREATE TABLE TESTDB.dbo.FirstComTable
( ID INT IDENTITY (1,1) PRIMARY KEY,
  FirstName VARCHAR (50),
  LastName VARCHAR (50),
  Address VARCHAR (500)
)
GO
CREATE TABLE TESTDB2.dbo.FirstComTable
( ID INT IDENTITY (1,1) PRIMARY KEY,
  FirstName VARCHAR (50),
  LastName VARCHAR (50),
  Address NVARCHAR (400)
)
GO

Después de crear las bases de datos y las tablas, llenaremos las dos tablas con cinco filas idénticas, luego insertaremos otro registro nuevo solo en la primera tabla, como se muestra en las declaraciones INSERT INTO T-SQL a continuación:

INSERT INTO TESTDB.dbo.FirstComTable VALUES ('AAA','BBB','CCC')
GO 5
INSERT INTO TESTDB2.dbo.FirstComTable VALUES ('AAA','BBB','CCC')
GO 5
INSERT INTO TESTDB.dbo.FirstComTable VALUES ('DDD','EEE','FFF')
GO

Ahora el entorno de prueba está listo para comenzar a describir los métodos de comparación de datos y esquemas.

Compara datos de tablas usando LEFT JOIN

La palabra clave LEFT JOIN T-SQL se usa para recuperar datos de dos tablas, devolviendo todos los registros de la tabla izquierda y solo los registros coincidentes de la tabla derecha y los valores NULL de la tabla derecha cuando no hay coincidencia entre las dos tablas.

Para fines de comparación de datos, la palabra clave LEFT JOIN se puede usar para comparar dos tablas, en función de la columna única común, como la columna ID en nuestro caso, como en la declaración SELECT a continuación:

SELECT *
FROM TESTDB.dbo.FirstComTable F
LEFT JOIN TESTDB2.dbo.FirstComTable S
ON F.ID =S.ID

La consulta anterior devolverá las cinco filas comunes existentes en las dos tablas, además de la fila que existe en la primera tabla y que falta en la segunda, al mostrar valores NULL en el lado derecho del resultado, como se muestra a continuación:

Puede derivar fácilmente del resultado anterior que la sexta columna que existe en la primera tabla no se encuentra en la segunda tabla. Para sincronizar las filas entre las tablas, debe insertar manualmente el nuevo registro en la segunda tabla. El método LEFT JOIN es útil para verificar las nuevas filas, pero no ayudará en el caso de actualizar los valores de las columnas. Si cambia el valor de la columna Dirección de la quinta fila, el método LEFT JOIN no detectará ese cambio como se muestra claramente a continuación:

Comparar datos de tablas usando la cláusula EXCEPT

La instrucción EXCEPT devuelve las filas de la primera consulta (consulta de la izquierda) que no se devuelven de la segunda consulta (consulta de la derecha). En otras palabras, la declaración EXCEPT devolverá la diferencia entre dos declaraciones o tablas SELECT, lo que nos ayuda a comparar fácilmente los datos en estas tablas.
La declaración EXCEPT se puede usar para comparar los datos en las tablas creadas previamente, tomando la diferencia entre la consulta SELECT * de la primera tabla y la consulta SELECT * de la segunda tabla, usando las instrucciones T-SQL a continuación:

SELECT * FROM TESTDB.dbo.FirstComTable F
EXCEPT 
SELECT * FROM TESTDB2.dbo. FirstComTable S

El resultado de la consulta anterior será la fila que está disponible en la primera tabla y no está disponible en la segunda, como se muestra a continuación:

El uso de la instrucción EXCEPT para comparar dos tablas es mejor que la instrucción LEFT JOIN, ya que los registros actualizados quedarán atrapados en el resultado de las diferencias de datos. Suponga que actualizamos la Dirección de la fila número 5 en la segunda tabla y verificamos la diferencia usando la declaración EXCEPT nuevamente, verá que la fila número 5 se devolverá con el resultado de las diferencias como se muestra a continuación:

La única desventaja de usar la declaración EXCEPT para comparar los datos en dos tablas es que necesita sincronizar los datos manualmente escribiendo una declaración INSERT para los registros que faltan en la segunda tabla. Tenga en cuenta que las dos tablas que se comparan son tablas con clave para obtener el resultado correcto, con una clave única utilizada para la comparación. Si eliminamos la columna ID única de la declaración SELECT en ambos lados de la declaración EXCEPT y enumeramos el resto de las columnas que no son clave, como en la siguiente declaración:

SELECT FirstName, LastName, Address FROM TESTDB.dbo. FirstComTable F
EXCEPT 
SELECT FirstName, LastName, Address FROM TESTDB2.dbo. FirstComTable S

El resultado mostrará que solo se devuelven los registros nuevos y los actualizados no se mostrarán, como se muestra en el siguiente resultado:

Compara datos de tablas usando UNION ALL... GROUP BY

La declaración UNION ALL también se puede usar para comparar los datos en dos tablas, en función de una columna de clave única. Para usar la declaración UNION ALL para devolver la diferencia entre dos tablas, debe enumerar las columnas para comparar en la declaración SELECT y usar estas columnas en la cláusula GROUP BY, como se muestra en la consulta T-SQL a continuación:

SELECT DISTINCT * 
  FROM
  (
  SELECT * FROM 
  ( SELECT * FROM TESTDB.dbo. FirstComTable      
  UNION ALL
    SELECT * FROM TESTDB2.dbo. FirstComTable) Tbls
    GROUP BY ID,FirstName, LastName, Address
    HAVING COUNT(*)<2) Diff

Y solo se devolverá la fila que existe en la primera tabla y que falta en la segunda tabla, como se muestra a continuación:

La consulta anterior también funcionará bien en el caso de actualizar registros pero de forma diferente. Devolverá los registros recién insertados además de las columnas actualizadas de ambas tablas, como en el caso de la fila número 5, que se muestra a continuación:

Comparar datos de tablas con herramientas de datos de SQL Server

Las herramientas de datos de SQL Server, también conocidas como SSDT, construidas sobre Microsoft Visual Studio, se pueden usar fácilmente para comparar los datos en dos tablas con el mismo nombre, en función de una columna de clave única, alojadas en dos bases de datos diferentes y sincronizar los datos en estas tablas. o generar un script de sincronización para usar más adelante.

Desde la ventana SSDT abierta, haga clic en el menú Herramientas -> Lista de SQL Server y elija la Nueva comparación de datos opción, como se muestra a continuación:

En la ventana de conexión que se muestra, puede elegir entre las sesiones conectadas anteriormente o completar la ventana Propiedades de conexión con el nombre de SQL Server, las credenciales y el nombre de la base de datos, luego haga clic en Conectar , como se muestra a continuación:

En el asistente de Comparación de datos nuevos que se muestra, especifique los nombres de las bases de datos de origen y de destino y las opciones de comparación utilizadas en el proceso de comparación de tablas, luego haga clic en Siguiente , como se muestra a continuación:

En la siguiente ventana, especifique el nombre de la tabla, que debe tener el mismo nombre en las bases de datos de origen y de destino, que se comparará en ambas bases de datos y haga clic en Finalizar , como se muestra a continuación:

El resultado que se muestra le mostrará la cantidad de registros que se encuentran en el origen y se pierden en el destino, se encuentran en el destino y se pierden en el origen, la cantidad de registros actualizados con la misma clave y valores de columnas diferentes (diferentes registros) y finalmente el número de registros idénticos encontrados en ambas tablas, como se muestra a continuación:

Haga clic en el nombre de la tabla en el resultado anterior, encontrará una vista detallada de estos hallazgos, como se muestra a continuación:

Puede usar la misma herramienta para generar un script para sincronizar las tablas de origen y de destino o actualizar la tabla de destino directamente con los cambios faltantes o diferentes, como se muestra a continuación:

Si hace clic en la opción Generar secuencia de comandos, se mostrará una instrucción INSERTAR con la columna que falta en la tabla de destino, como se muestra a continuación:
COMENZAR TRANSACCIÓN

BEGIN TRANSACTION
SET IDENTITY_INSERT [dbo].[FirstComTable] ON
INSERT INTO [dbo].[FirstComTable] ([ID], [FirstName], [LastName], [Address]) VALUES (6, N'DDD', N'EEE', N'FFF')
SET IDENTITY_INSERT [dbo].[FirstComTable] OFF
COMMIT TRANSACTION

Si elige la opción Actualizar objetivo, primero le pedirá su confirmación para realizar el cambio, como se muestra en el siguiente mensaje:

Después de la sincronización, verá que los datos en las dos tablas serán idénticos, como se muestra a continuación:

Compare los datos de las tablas con la herramienta de terceros "dbForge Studio for SQL Server"

En el mundo de SQL Server, puede encontrar una gran cantidad de herramientas de terceros que facilitan la vida de los administradores y desarrolladores de bases de datos. Una de estas herramientas, que hace que las tareas de administración de bases de datos sean pan comido, es dbForge Studio for SQL Server, que nos brinda formas fáciles de realizar las tareas de administración y desarrollo de bases de datos. Esta herramienta también puede ayudarnos a comparar los datos en las tablas de la base de datos y sincronizar estas tablas.

En el menú Comparación, elija Nueva comparación de datos opción, como se muestra a continuación:

En el asistente de Comparación de datos nuevos, especifique la base de datos de origen y de destino y, a continuación, haga clic en Siguiente. :

Elija las opciones adecuadas de la amplia gama de opciones de mapeo y comparación disponibles y haga clic en Siguiente :

Especifique el nombre de la tabla o tablas que participarán en el proceso de comparación de datos. El asistente mostrará un mensaje de advertencia en caso de que haya diferencias de esquema entre las tablas de las bases de datos de origen y de destino. Haz clic en Comparar para proceder:

El resultado final le mostrará en detalle las diferencias de datos entre las tablas de origen y de destino, con la posibilidad de hacer clic para sincronizar las tablas de origen y destino, como se muestra a continuación:

Comparar esquema de tablas usando sys.columns

Como se mencionó al principio de este artículo, para replicar o archivar una tabla, debe asegurarse de que el esquema de las tablas de origen y de destino sea idéntico. SQL Server nos proporciona diferentes formas de comparar el esquema de las tablas en la misma base de datos o en diferentes bases de datos. El primer método es consultar la vista de catálogo del sistema sys.columns, que devuelve una fila para cada columna de un objeto que tiene una columna, con las propiedades de cada columna.

Para comparar el esquema de tablas ubicadas en diferentes bases de datos, debe proporcionar sys.columns con el nombre de la tabla en la base de datos actual, sin poder proporcionar una tabla alojada en otra base de datos. Para lograrlo, consultaremos sys.columns dos veces, guardaremos el resultado de cada consulta en una tabla temporal y finalmente compararemos el resultado de estas dos consultas usando el comando EXCEPT T-SQL, como se muestra claramente a continuación:

USE TESTDB
SELECT name, system_type_id, user_type_id,max_length, precision,scale, is_nullable, is_identity INTO #DBSchema FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.FirstComTable')
GO
USE TestDB2
GO
SELECT name, system_type_id, user_type_id,max_length, precision,scale, is_nullable, is_identity INTO #DB2Schema FROM sys.columns
WHERE object_id = OBJECT_ID(N'dbo.FirstComTable ');

GO 
SELECT * FROM #DBSchema
EXCEPT 
SELECT * FROM #DB2Schema

El resultado nos mostrará que la definición de la columna Dirección es diferente en estas dos tablas, sin información específica sobre la diferencia exacta, como se muestra a continuación:

Comparar el esquema de las tablas usando INFORMACION_ESQUEMA.COLUMNAS

La vista del sistema INFORMACION_ESQUEMA.COLUMNAS también se puede utilizar para comparar el esquema de diferentes tablas, proporcionando el nombre de la tabla. Nuevamente, para comparar dos tablas alojadas en diferentes bases de datos, consultaremos INFORMACION_ESQUEMA.COLUMNAS dos veces, mantendremos el resultado de cada consulta en una tabla temporal y finalmente compararemos el resultado de estas dos consultas usando el comando EXCEPT T-SQL, como se muestra claramente a continuación:

USE TestDB
SELECT COLUMN_NAME, IS_NULLABLE,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION,NUMERIC_SCALE  INTO #DBSchema FROM [INFORMATION_SCHEMA].[COLUMNS] SC1
WHERE SC1.TABLE_NAME='FirstComTable'
GO
USE TestDB2
SELECT COLUMN_NAME, IS_NULLABLE,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION,NUMERIC_SCALE INTO #DB2Schema FROM [INFORMATION_SCHEMA].[COLUMNS] SC2
 WHERE SC2.TABLE_NAME='FirstComTable'
GO 
SELECT * FROM #DBSchema
EXCEPT 
SELECT * FROM #DB2Schema

Y el resultado será de alguna manera similar al anterior, mostrando que la definición de la columna Dirección es diferente en estas dos tablas, sin información específica sobre la diferencia exacta, como se muestra a continuación:

Comparar esquema de tablas usando dm_exec_describe_first_result_set

Los esquemas de las tablas también se pueden comparar consultando la función de gestión dinámica dm_exec_describe_first_result_set, que toma una instrucción Transact-SQL como parámetro y describe los metadatos del primer conjunto de resultados de la instrucción.

Para comparar el esquema de dos tablas, debe unir el DMF dm_exec_describe_first_result_set consigo mismo, proporcionando la declaración SELECT de cada tabla como parámetro, como en la consulta T-SQL a continuación:

SELECT FT.name , ST.name  , 
FT.system_type_name  , ST.system_type_name ,
FT.max_length  , ST.max_length ,
FT.precision  , ST.precision ,
FT.scale  , ST.scale ,
FT.is_nullable  , ST.is_nullable , 
FT.is_identity_column  , ST.is_identity_column 
FROM sys.dm_exec_describe_first_result_set (N'SELECT * FROM TestDB.DBO.FirstComTable', NULL, 0) FT
LEFT OUTER JOIN  sys.dm_exec_describe_first_result_set (N'SELECT * FROM TestDB2.DBO.FirstComTable', NULL, 0) ST
ON FT.Name =ST.Name
GO

El resultado será más claro esta vez, ya que puede comparar a simple vista la diferencia entre las dos tablas, es decir, el tamaño y el tipo de la columna Dirección, como se muestra a continuación:

Comparar el esquema de tablas con las herramientas de datos de SQL Server

SQL Server Data Tools también se puede usar para comparar el esquema de tablas ubicadas en diferentes bases de datos. En el menú Herramientas, seleccione Nueva comparación de esquemas. opción de la lista de opciones de SQL Server, como se muestra a continuación:

Después de proporcionar los parámetros de conexión, haga clic en el botón Comparar:

El resultado de la comparación le mostrará, en concreto, la diferencia de esquema entre las dos tablas en forma de comandos CREATE TABLE T-SQL, sombreados como en la siguiente instantánea:

Puede hacer clic fácilmente para sincronizar el esquema de la tabla o haga clic en para escribir el cambio y realizarlo más tarde, como se muestra a continuación:

Comparar el esquema de tablas con dbForge Studio para la herramienta de terceros de SQL Server

La herramienta dbForge Studio for SQL Server nos brinda la posibilidad de comparar el esquema de las diferentes tablas de la base de datos. En el menú Comparación, elija la Comparación de esquema nuevo opción, como se muestra a continuación:

Después de especificar las propiedades de conexión de las bases de datos de origen y de destino, elija la opción de mapeo adecuada entre las opciones disponibles y haga clic en Siguiente :

Elija los esquemas con los que comparará su objeto y haga clic en Siguiente :

Especifique la tabla o tablas que participarán en el proceso de comparación de esquemas y haga clic en Comparar , si desea omitir el cambio de la configuración predeterminada en la ventana Filtro de objetos, como se muestra a continuación:

El resultado de la comparación que se muestra le mostrará la diferencia entre el esquema de las dos tablas, resaltando exactamente la parte del tipo de datos que difiere entre las dos columnas, con la capacidad de especificar qué acción se debe realizar para sincronizar las dos tablas, como se muestra a continuación. :

Si organiza sincronizar el esquema de las dos tablas, haga clic en el botón y especifique en el asistente de Sincronización de esquemas si logra ejecutar el cambio directamente en la tabla de destino, o simplemente crear un script para usarlo en el futuro, como se muestra a continuación:

Enlaces útiles:

  • Establecer operadores:EXCEPT e INTERSECT (Transact-SQL)
  • Establecer operadores:UNION (Transact-SQL)
  • Descargar herramientas de datos de SQL Server (SSDT)
  • Compare y sincronice datos en una o más tablas con datos en una base de datos de referencia
  • sys.dm_exec_describe_first_result_set (Transact-SQL)
  • sys.columnas (Transact-SQL)
  • Vistas de esquema de información del sistema (Transact-SQL)

Herramientas útiles:

dbForge Schema Compare para SQL Server:herramienta confiable que ahorra tiempo y esfuerzo al comparar y sincronizar bases de datos en SQL Server.

Comparación de datos de dbForge para SQL Server:una poderosa herramienta de comparación de SQL capaz de trabajar con grandes datos.