Questa query visualizza i campi mancanti o differenti tra un database e
l'altro. Basta sostituire il nome dei databases nella seconda e terza riga.
L'utilizzo più frequente è quello di allineare i database (per esempio quello di sviluppo e quello di produzione) senza comprare prodotti di terze parti che confrontano i db.
Il nome del database può essere anche un linked server SQL Server, altrimenti baasta ricopiare la struttura sul prorpio server e lanciare lo script
declare @db1 varchar(25), @db2 varchar(25), @sql1 varchar(5000), @sql2 varchar(5000), @sql3 varchar(5000) set @db1 = 'database1' set @db2 = 'database2' set @sql1 = '(select O1.name Tabella, C1.colId, C1.name Campo, T1.name Tipo, C1.length Lunghezza, C1.xPrec Precisione, C1.xScale Scale, C1.isNullable from ' + @db1 + '.dbo.syscolumns C1 join ' + @db1 + '.dbo.sysobjects O1 on C1.id = O1.id join ' + @db1 + '.dbo.systypes T1 on C1.xtype = T1.xusertype) DB1 ' set @sql2 = '(select O1.name Tabella, C1.ColId, C1.name Campo, T1.name Tipo, C1.length Lunghezza, C1.xPrec Precisione, C1.xScale Scale, C1.isNullable from ' + @db2 + '.dbo.syscolumns C1 join ' + @db2 + '.dbo.sysobjects O1 on C1.id = O1.id join ' + @db2 + '.dbo.systypes T1 on C1.xtype = T1.xusertype) DB2 ' set @sql3 = 'select DB1.* , ''' + @db1 + ' <--------> ' + @db2 + ''', DB2.* from ' + @sql1 + ' full outer join ' + @sql2 + ' on Db1.Tabella = Db2.tabella and Db1.Campo = Db2.Campo where Db1.Tabella is null or DB2.Tabella is null or Db1.Tipo <> DB2.Tipo or DB1.Lunghezza <> DB2.Lunghezza or DB1.Precisione <> DB2.Precisione or DB1.Scale <> DB2.Scale or DB1.isNUllable <> DB2.isNullable order by case when Db1.Tabella is null then DB2.Tabella else DB1.Tabella end, case when isnull(DB1.Colid,1000) < isnull(Db2.Colid,1000) then DB1.ColId else DB2.ColId end' exec (@sql3)