Confronto struttura tra due Database

Home | SQL Server

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)

		
Home