2009-11-12 38 views
5

Recientemente he descubierto la utilidad tablediff de SQL Server 2005.Uso tablediff de comparar todas las tablas

tengo 2 casos de la misma base de datos de cada uno en un servidor diferente.

¿Es posible comparar todas las tablas usando tablediff sin tener que replicar el mismo comando mientras solo cambia el nombre de la tabla?

Por ejemplo, compare table1 en server1 con table1 en server2 y luego compare table2 en server1 con table2 en server2, hasta que todas las tablas hayan sido comparadas.

Respuesta

7

Esto se puede hacer mediante el establecimiento de la opción -sourceserver de la utilidad tablediff al primer servidor y la opción -destinationserver al segundo servidor. Puede usar las tablas sys.To para iterar a través de cada tabla en la base de datos para que pueda automatizar este proceso.

editado

También quería señalar this article que es una ingeniosa pieza de código T-SQL que pueden servirle mejor sin las complicaciones de tablediff

por su comentario, aquí es un ejemplo . Esta no es una forma óptima de hacer esto en un entorno de producción, pero debería hacer el trabajo por usted. Probablemente sería mejor implementar esto en SSIS si necesita una opción más digna de producción.

SET QUOTED_IDENTIFIER ON 

DECLARE @TableNames as table (
    id int identity(1,1), 
    tableName varchar(100)) 

DECLARE @sTableDiff nvarchar(1000) 
DECLARE @tableName varchar(100) 
DECLARE @counter int 
DECLARE @maxCount int 

INSERT INTo @TableNames 
SELECT name 
FROM sysobjects WHERE type = 'U' 

SET @counter = 1 

SELECT @maxCount = COUNT(name) 
FROM sysobjects WHERE type = 'U' 

WHILE @counter < @maxCount 
    Begin 
     SELECT @tableName = tableName 
     FROM @TableNames 
     WHERE id = @counter 

     SET @sTableDiff= ' "C:\Program Files\Microsoft SQL Server\90\COM\tablediff" -sourceserver Server1 
      -sourceuser sa -sourcepassword password -sourcedatabase YourDatabase -sourcetable ' + @tableName + ' 
      -destinationserver Server2 -destinationuser sa -destinationpassword password -destinationdatabase 
      YourDatabase -destinationtable ' + @tableName + ' -f c:\Diff'  

     EXEC XP_CMDSHELL @sTableDiff 

     Set @counter = @counter + 1 
    End 
+0

¿Puedes dar un ejemplo? ¡Gracias! – Davie

+0

Cuando ejecuto este script sql, hay un error donde tablediff dice que no puede conectarse a la base de datos. Sin embargo, cuando ejecuto exactamente la misma consulta en un indicador de dos, funciona sin ningún problema, es decir, ¡tablediff informa que las 2 tablas son idénticas! ¿Alguna idea? – Davie

+0

No estoy seguro, este es un script que he usado muchas veces, así que sé que funciona. Si agrega Print @sTableDiff al script y luego ejecuta el resultado en el símbolo del sistema, ¿funciona? –

0

¿Se puede utilizar esta opción para ejecutar las sentencias sql en un archivo de script y comparar? Puedo estar equivocado solo un pensamiento.

number_of_statements -bf

Cuestiones relacionadas