Comparazione dei dati di due tabelle

Ho trovato un ottimo sistema per fare la comparazione dei dati di due tabelle su di un articolo che ho trovato in rete (Fonte.

Grazie alla stored procedure illustrata nell’articolo, che vi riporto in fondo, possiamo passare come parametri:

  • il nome della prima tabella da comparare (@table1)
  • il nome della seconda tabella da comparare (@table2)
  • una stringa con l’elenco dei campi della prima tabella (@T1ColumnList)
  • una stringa con l’elenco dei campi della seconda tabella (@T2ColumnList) (Se i campi si chiamano nello stesso modo possiamo passare solo il primo parametro (@T1ColumnList)

Tutti i record visualizzati dalla stored procedure ci avvisano che quei record:

  • o sono presenti solo nella tabella A (prima tabella)
  • o sono presenti solo nella tabella B (seconda tabella)
  • o sono presenti in entrambe le tabelle ma hanno qualche campo diverso

 
CREATE PROCEDURE CompareTables(@table1 varchar(100),
 @table2 Varchar(100), @T1ColumnList varchar(1000),
 @T2ColumnList varchar(1000) = '')
AS
 
-- Table1, Table2 are the tables or views to compare.
-- T1ColumnList is the list of columns to compare, from table1.
-- Just list them comma-separated, like in a GROUP BY clause.
-- If T2ColumnList is not specified, it is assumed to be the same
-- as T1ColumnList.  Otherwise, list the columns of Table2 in
-- the same order as the columns in table1 that you wish to compare.
--
-- The result is all rows from either table that do NOT match
-- the other table in all columns specified, along with which table that
-- row is from.
 
declare @SQL varchar(8000);
 
IF @t2ColumnList = '' SET @T2ColumnList = @T1ColumnList
 
SET @SQL = 'SELECT ''' + @table1 + ''' AS TableName, ' + @t1ColumnList +
 ' FROM ' + @Table1 + ' UNION ALL SELECT ''' + @table2 + ''' As TableName, ' +
 @t2ColumnList + ' FROM ' + @Table2
 
SET @SQL = 'SELECT Max(TableName) as TableName, ' + @t1ColumnList +
 ' FROM (' + @SQL + ') A GROUP BY ' + @t1ColumnList +
 ' HAVING COUNT(*) = 1'
 
exec ( @SQL)