Often we programmers wants to compare the object mismatch between two databases. 

Here is the scripts that may make your life easier. 

This SQL script will compare table columns, Index and foreign keys in two databases, I am planning to countinue this further to add more and more options to this. This will show a result with missing objects and the objects with definition mismatch.

Please supply the database names in the variables @SourceDB and @TargetDb .

This script will check for all the objects like Tables , Views , Primary keys , Foreign keys , Triggers , Procedures etc.

This is the sample usage

exec SP_Comparedb db1,db2

 

To get the latest copy of the script, visit the below link

http://blog.sqlthoughts.com/2013/09/20/compare-database-objects/

17/05: Script updated with few bug fixes in the above link 

 

 

SQL
Edit|Remove
CREATE PROC sp_CompareDb(  
                            @SourceDB SYSNAME, 
                            @TargetDb SYSNAME 
                            )                        
AS 
 
 
/* 
DECLARE @SourceDB SYSNAME='DB1',  
                  @TargetDb SYSNAME='DB2' 
*/ 
  SET nocount ON  
  SET ansi_warnings ON  
  SET ansi_nulls ON  
   
  DECLARE @sqlStr VARCHAR(8000)   
  SET @SourceDBRtrim(Ltrim(@SourceDB)) 
  IF DB_ID(@SourceDBIS NULL  
  BEGIN 
        PRINT 'Error: Unable to find the database '@SourceDB +'!!!' 
        RETURN 
  END 
   
  SET @TargetDbRtrim(Ltrim(@TargetDb)) 
  IF DB_ID(@TargetDbIS NULL  
  BEGIN 
        PRINT 'Error: Unable to find the database '@TargetDb +'!!!' 
        RETURN 
    END 
     
  PRINT Replicate('-'Len(@SourceDB) + Len(@TargetDb) + 25)  
  PRINT 'Comparing databases ' + @SourceDB + ' and ' + @TargetDb  
  PRINT Replicate('-'Len(@SourceDB) + Len(@TargetDb) + 25)      
  -----------------------------------------------------------------------------------------  
    -- Create temp tables needed to hold the db structure  
    -----------------------------------------------------------------------------------------      
     
    IF OBJECT_ID('TEMPDB..#TABLIST_SOURCE')IS NOT NULL  
        DROP TABLE #TABLIST_SOURCE 
    IF OBJECT_ID('TEMPDB..#TABLIST_TARGET')IS NOT NULL  
        DROP TABLE #TABLIST_TARGET 
    IF OBJECT_ID('TEMPDB..#IDXLIST_SOURCE')IS NOT NULL  
        DROP TABLE #IDXLIST_SOURCE 
    IF OBJECT_ID('TEMPDB..#IDXLIST_TARGET')IS NOT NULL  
        DROP TABLE #IDXLIST_TARGET 
    IF OBJECT_ID('TEMPDB..#FKLIST_SOURCE')IS NOT NULL  
        DROP TABLE #FKLIST_SOURCE 
    IF OBJECT_ID('TEMPDB..#FKLIST_TARGET')IS NOT NULL  
        DROP TABLE #FKLIST_TARGET 
    IF OBJECT_ID('TEMPDB..#TAB_RESULTS')IS NOT NULL  
        DROP TABLE #TAB_RESULTS 
    IF OBJECT_ID('TEMPDB..#IDX_RESULTS')IS NOT NULL  
        DROP TABLE #IDX_RESULTS 
    IF OBJECT_ID('TEMPDB..#FK_RESULTS')IS NOT NULL  
        DROP TABLE #FK_RESULTS 
                 
  CREATE TABLE #TABLIST_SOURCE 
  (  
        ID INT IDENTITY(1,1), 
        DATABASENAME sysname, 
        TABLENAME SYSNAME , 
        COLUMNNAME SYSNAME, 
        DATATYPE SYSNAME, 
        NULLABLE VARCHAR(15) 
  )  
   
  CREATE TABLE #TABLIST_TARGET 
  (  
        ID INT IDENTITY(1,1), 
        DATABASENAME sysname, 
        TABLENAME SYSNAME , 
        COLUMNNAME SYSNAME, 
        DATATYPE SYSNAME, 
        NULLABLE VARCHAR(15) 
  )  
   
  CREATE TABLE #IDXLIST_SOURCE 
  (  
        ID INT IDENTITY(1,1), 
        DATABASENAME sysname, 
        TABLE_NAME SYSNAME, 
        IDX_NAME    SYSNAME , 
        IDX_TYPE VARCHAR(20), 
        IS_PRIMARY_KEY VARCHAR(10), 
        IS_UNIQUE VARCHAR(10), 
        IDX_COLUMNS VARCHAR(1000), 
        IDX_INCLUDED_COLUMNS VARCHAR(1000) 
  ); 
   
  CREATE TABLE #IDXLIST_TARGET 
  (  
        ID INT IDENTITY(1,1), 
        DATABASENAME sysname, 
        TABLE_NAME SYSNAME, 
        IDX_NAME    SYSNAME , 
        IDX_TYPE VARCHAR(20), 
        IS_PRIMARY_KEY VARCHAR(10), 
        IS_UNIQUE VARCHAR(10), 
        IDX_COLUMNS VARCHAR(1000), 
        IDX_INCLUDED_COLUMNS VARCHAR(1000) 
  ); 
   
  CREATE TABLE #FKLIST_SOURCE 
  (  
        ID INT IDENTITY(1,1), 
        DATABASENAME sysname, 
        FK_NAME SYSNAME, 
        FK_TABLE sysname, 
        FK_COLUMNS varchar(1000), 
        PK_TABLE sysname, 
        PK_COLUMNS varchar(1000) 
  ); 
   
  CREATE TABLE #FKLIST_TARGET 
  ( 
        ID INT IDENTITY(1,1), 
        DATABASENAME sysname, 
        FK_NAME SYSNAME, 
        FK_TABLE sysname, 
        FK_COLUMNS varchar(1000), 
        PK_TABLE sysname, 
        PK_COLUMNS varchar(1000) 
  ); 
   
  CREATE TABLE #TAB_RESULTS 
  ( 
        ID INT IDENTITY(1,1), 
        DATABASENAME sysname, 
        TABLENAME SYSNAME , 
        COLUMNNAME SYSNAME, 
        DATATYPE SYSNAME, 
        NULLABLE VARCHAR(15), 
        REASON VArchar(150) 
  ); 
   
  CREATE TABLE #IDX_RESULTS 
  ( 
        ID INT IDENTITY(1,1), 
        DATABASENAME sysname, 
        TABLE_NAME SYSNAME, 
        IDX_NAME    SYSNAME , 
        IDX_TYPE VARCHAR(20), 
        IS_PRIMARY_KEY VARCHAR(10), 
        IS_UNIQUE VARCHAR(10), 
        IDX_COLUMNS VARCHAR(1000), 
        IDX_INCLUDED_COLUMNS VARCHAR(1000), 
        REASON Varchar(150) 
  ); 
   
  CREATE TABLE #FK_RESULTS 
  ( 
        ID INT IDENTITY(1,1), 
        DATABASENAME sysname, 
        FK_NAME SYSNAME, 
        FK_TABLE sysname, 
        FK_COLUMNS varchar(1000), 
        PK_TABLE sysname, 
        PK_COLUMNS varchar(1000), 
        REASON VArchar(150) 
  ); 
 
  PRINT 'Getting table and column list!'; 
  PRINT Replicate('-'Len(@SourceDB) + Len(@TargetDb) + 25); 
   
  BEGIN  
        INSERT INTO #TABLIST_SOURCE(DATABASENAME, TABLENAME,COLUMNNAME,DATATYPE,NULLABLE) 
        EXEC('SELECT '''+@SourceDB +'''T.TABLE_NAME TABLENAME,  
             C.COLUMN_NAME COLUMNNAME, 
             TY.name + case when TY.name IN (''char'',''varchar'',''nvarchar'') THEN     
                ''(''+CASE WHEN C.CHARACTER_MAXIMUM_LENGTH>0 THEN CAST(C.CHARACTER_MAXIMUM_LENGTH AS VARCHAR) ELSE ''max''END+'')'' 
                ELSE     
                    '''' 
                END 
                DATATYPE, 
                CASE WHEN C.is_nullable=''NO'' THEN     
                    ''NOT NULL''  
                    ELSE 
                    ''NULL'' 
                END NULLABLE 
                    FROM '+@SourceDB+'.INFORMATION_SCHEMA.TABLES T  
                        INNER JOIN  '+@SourceDB+'.INFORMATION_SCHEMA.COLUMNS C 
                            ON T.TABLE_NAME=C.TABLE_NAME 
                            and T.TABLE_CATALOG=C.TABLE_CATALOG 
                            and T.TABLE_SCHEMA=C.TABLE_SCHEMA 
                         INNER JOIN '+@SourceDB+'.sys.types TY 
                        ON C.DATA_TYPE =TY.name         
                        ORDER BY TABLENAMECOLUMNNAME,C.ORDINAL_POSITION');         
 
        INSERT INTO #TABLIST_TARGET(DATABASENAME, TABLENAME,COLUMNNAME,DATATYPE,NULLABLE) 
        EXEC('SELECT '''+@TargetDB +'''T.TABLE_NAME TABLENAME,  
             C.COLUMN_NAME COLUMNNAME, 
             TY.name + case when TY.name IN (''char'',''varchar'',''nvarchar'') THEN     
                ''(''+CASE WHEN C.CHARACTER_MAXIMUM_LENGTH>0 THEN CAST(C.CHARACTER_MAXIMUM_LENGTH AS VARCHAR) ELSE ''max''END+'')'' 
                ELSE     
                    '''' 
                END 
                DATATYPE, 
                CASE WHEN C.is_nullable=''NO'' THEN     
                    ''NOT NULL''  
                    ELSE 
                    ''NULL'' 
                END NULLABLE 
                    FROM '+@TargetDB+'.INFORMATION_SCHEMA.TABLES T  
                        INNER JOIN  '+@TargetDB+'.INFORMATION_SCHEMA.COLUMNS C 
                            ON T.TABLE_NAME=C.TABLE_NAME 
                            and T.TABLE_CATALOG=C.TABLE_CATALOG 
                            and T.TABLE_SCHEMA=C.TABLE_SCHEMA 
                         INNER JOIN '+@TargetDB+'.sys.types TY 
                        ON C.DATA_TYPE =TY.name         
                        ORDER BY TABLENAMECOLUMNNAME,C.ORDINAL_POSITION'); 
 
 
        PRINT 'Getting index list!'; 
        PRINT Replicate('-'Len(@SourceDB) + Len(@TargetDb) + 25); 
   
    INSERT INTO #IDXLIST_SOURCE(DATABASENAME, TABLE_NAME,IDX_NAME,IDX_TYPE,IS_PRIMARY_KEY,IS_UNIQUE,IDX_COLUMNS,IDX_INCLUDED_COLUMNS) 
        EXEC ('WITH CTE AS (  
           SELECT      ic.index_id + ic.object_id AS IndexId,t.name AS TableName  
                       ,i.name AS IndexName 
                                             ,case when ic.is_included_column =0 then 
                                                    c.name end AS ColumnName 
                                            ,case when ic.is_included_column =1 then 
                                                    c.name end AS IncludedColumn 
                                                    ,i.type_desc  
                       ,i.is_primary_key,i.is_unique  
           FROM  '+@SourceDB+'.sys.indexes i  
           INNER JOIN '+@SourceDB+'.sys.index_columns ic  
                   ON  i.index_id    =   ic.index_id  
                   AND i.object_id   =   ic.object_id  
           INNER JOIN '+@SourceDB+'.sys.columns c  
                   ON  ic.column_id  =   c.column_id  
                   AND i.object_id   =   c.object_id  
           INNER JOIN '+@SourceDB+'.sys.tables t  
                   ON  i.object_id = t.object_id  
)  
SELECT '''+@SourceDB+''',c.TableName TABLE_NAME,c.IndexName INDEX_NAME,c.type_desc INDEX_TYPE ,c.is_primary_key IS_PRIMARY_KEY,c.is_unique IS_UNIQUE 
       ,STUFF( ( SELECT '',''+ a.ColumnName FROM CTE a WHERE c.IndexId = a.IndexId FOR XML PATH('''')),1 ,1, '''') AS COLUMNS 
       ,STUFF( ( SELECT '',''+ a.IncludedColumn FROM CTE a WHERE c.IndexId = a.IndexId FOR XML PATH('''')),1 ,1, '''') AS INCLUDED_COLUMNS 
FROM   CTE c  
GROUP  BY c.IndexId,c.TableName,c.IndexName,c.type_desc,c.is_primary_key,c.is_unique  
ORDER  BY c.TableName ASC,c.is_primary_key DESC; ' ); 
 
 
    INSERT INTO #IDXLIST_TARGET(DATABASENAME,TABLE_NAME,IDX_NAME,IDX_TYPE,IS_PRIMARY_KEY,IS_UNIQUE,IDX_COLUMNS,IDX_INCLUDED_COLUMNS) 
        EXEC ('WITH CTE AS (  
           SELECT      ic.index_id + ic.object_id AS IndexId,t.name AS TableName  
                       ,i.name AS IndexName 
                                             ,case when ic.is_included_column =0 then 
                                                    c.name end AS ColumnName 
                                            ,case when ic.is_included_column =1 then 
                                                    c.name end AS IncludedColumn 
                                                    ,i.type_desc  
                       ,i.is_primary_key,i.is_unique  
           FROM  '+@TargetDB+'.sys.indexes i  
           INNER JOIN '+@TargetDB+'.sys.index_columns ic  
                   ON  i.index_id    =   ic.index_id  
                   AND i.object_id   =   ic.object_id  
           INNER JOIN '+@TargetDB+'.sys.columns c  
                   ON  ic.column_id  =   c.column_id  
                   AND i.object_id   =   c.object_id  
           INNER JOIN '+@TargetDB+'.sys.tables t  
                   ON  i.object_id = t.object_id  
)  
SELECT '''+@TargetDB+''',c.TableName,c.IndexName,c.type_desc,c.is_primary_key,c.is_unique  
       ,STUFF( ( SELECT '',''+ a.ColumnName FROM CTE a WHERE c.IndexId = a.IndexId FOR XML PATH('''')),1 ,1, '''') AS Columns  
       ,STUFF( ( SELECT '',''+ a.IncludedColumn FROM CTE a WHERE c.IndexId = a.IndexId FOR XML PATH('''')),1 ,1, '''') AS IncludedColumns  
FROM   CTE c  
GROUP  BY c.IndexId,c.TableName,c.IndexName,c.type_desc,c.is_primary_key,c.is_unique  
ORDER  BY c.TableName ASC,c.is_primary_key DESC; '); 
   
   
PRINT 'Getting foreign key list!'PRINT Replicate('-'Len(@SourceDB) + Len(@TargetDb) + 25); 
 
INSERT INTO #FKLIST_SOURCE(DATABASENAME, FK_NAME,FK_TABLE,FK_COLUMNS,PK_TABLE,PK_COLUMNS) 
    EXEC ('With CTE 
                AS 
            (select OBJECT_NAME(FK.parent_object_id,db_id('''+@TargetDB+''')) PK_TABLE,      
                        C1.name PK_COLUMN, 
            object_name(FK.referenced_object_id,db_id('''+@TargetDB+'''))FK_TABLE, 
            C2.name FK_COLUMN, 
            FK.name     FK_NAME 
from 
        '+@SourceDB+'.sys.foreign_keys FK 
            inner join  
        '+@SourceDB+'.sys.foreign_key_columns FKC 
            on FK.object_id=FKC.constraint_object_id 
            inner join  
        '+@SourceDB+'.sys.columns C1  
            on FKC.parent_column_id=C1.column_id 
            and FKC.parent_object_id=C1.object_id 
            inner join  
        '+@SourceDB+'.sys.columns C2 
            on FKC.referenced_column_id=C2.column_id 
            and FKC.referenced_object_id=C2.object_id                             
    ) 
SELECT '''+@SourceDB+''',C.FK_NAME, 
             C.FK_TABLE,             STUFF( ( SELECT '',''+ A.FK_COLUMN FROM CTE a WHERE c.FK_NAME = a.FK_NAME and C.FK_TABLE=a.FK_TABLE FOR XML PATH('''')),1 ,1, '''') AS FK_COLUMNS, 
             C.PK_TABLE,                           
             STUFF( ( SELECT '',''+ A.PK_Column FROM CTE a WHERE c.FK_NAME = a.FK_NAME and C.PK_TABLE=a.PK_TABLE FOR XML PATH('''')),1 ,1, '''') AS PK_COLUMNS  
FROM CTE C 
group by C.FK_NAME, 
             C.FK_TABLE,              
             C.PK_TABLE')              
              
INSERT INTO #FKLIST_TARGET(DATABASENAME, FK_NAME,FK_TABLE,FK_COLUMNS,PK_TABLE,PK_COLUMNS) 
EXEC(' 
        With CTE 
AS 
(select OBJECT_NAME(FK.parent_object_id,db_id('''+@TargetDB+''')) PK_TABLE,      
            C1.name PK_COLUMN, 
            object_name(FK.referenced_object_id,db_id('''+@TargetDB+'''))FK_TABLE, 
            C2.name FK_COLUMN, 
            FK.name     FK_NAME 
from 
        '+@TargetDB+'.sys.foreign_keys FK 
            inner join  
        '+@TargetDB+'.sys.foreign_key_columns FKC 
            on FK.object_id=FKC.constraint_object_id 
            inner join  
        '+@TargetDB+'.sys.columns C1  
            on FKC.parent_column_id=C1.column_id 
            and FKC.parent_object_id=C1.object_id 
            inner join  
        '+@TargetDB+'.sys.columns C2 
            on FKC.referenced_column_id=C2.column_id 
            and FKC.referenced_object_id=C2.object_id                             
    ) 
SELECT '''+@TargetDB+''',C.FK_NAME, 
             C.FK_TABLE,             STUFF( ( SELECT '',''+ A.FK_COLUMN FROM CTE a WHERE c.FK_NAME = a.FK_NAME and C.FK_TABLE=a.FK_TABLE FOR XML PATH('''')),1 ,1, '''') AS FK_COLUMNS, 
             C.PK_TABLE,                           
             STUFF( ( SELECT '',''+ A.PK_Column FROM CTE a WHERE c.FK_NAME = a.FK_NAME and C.PK_TABLE=a.PK_TABLE FOR XML PATH('''')),1 ,1, '''') AS PK_COLUMNS  
FROM CTE C 
group by C.FK_NAME, 
             C.FK_TABLE,              
             C.PK_TABLE')   
END; 
 
PRINT 'Print column mismatches!'PRINT Replicate('-'Len(@SourceDB) + Len(@TargetDb) + 25); 
 
INSERT INTO #TAB_RESULTS(DATABASENAME, TABLENAME,COLUMNNAME,DATATYPE,NULLABLE,REASON) 
SELECT @SourceDB AS DATABASENAME,TABLENAME,COLUMNNAME,DATATYPE,NULLABLE,REASON FROM  
(SELECT TABLENAME,COLUMNNAME,DATATYPE,NULLABLE FROM #TABLIST_SOURCE 
EXCEPT  
SELECT TS.TABLENAME,TS.COLUMNNAME,TS.DATATYPE,TS.NULLABLE FROM #TABLIST_SOURCE TS 
INNER JOIN 
#TABLIST_TARGET TT 
ON TS.TABLENAME=TT.TABLENAME AND TS.COLUMNNAME=TT.COLUMNNAMETAB_NONMATCH 
CROSS JOIN (SELECT 'Missing Column' As Reason)Tab2  
UNION ALL 
SELECT @TargetDb as DATABASENAME,TABLENAME,COLUMNNAME,DATATYPE,NULLABLE,REASON FROM  
(SELECT TABLENAME,COLUMNNAME,DATATYPE,NULLABLE FROM #TABLIST_TARGET 
EXCEPT  
SELECT TT.TABLENAME,TT.COLUMNNAME,TT.DATATYPE,TT.NULLABLE FROM #TABLIST_TARGET TT 
INNER JOIN 
#TABLIST_SOURCE TS 
ON TS.TABLENAME=TT.TABLENAME AND TS.COLUMNNAME=TT.COLUMNNAMETAB_MATCH  
CROSS JOIN (SELECT 'Missing column ' As Reason)Tab2  
 
--NON MATCHING COLUMNS 
INSERT INTO #TAB_RESULTS(DATABASENAME,TABLENAME,COLUMNNAME,DATATYPE,NULLABLE,REASON) 
    SELECT  
        @SourceDB as DATABASENAME, 
        TABLENAME, 
        COLUMNNAME, 
        DATATYPE, 
        NULLABLE, 
        REASON 
    FROM 
    (SELECT * FROM  
    (SELECT TS.TABLENAME,TS.COLUMNNAME,TS.DATATYPE,TS.NULLABLE FROM #TABLIST_SOURCE TS 
        INNER JOIN 
         #TABLIST_TARGET TT ON TS.TABLENAME=TT.TABLENAME AND TS.COLUMNNAME=TT.COLUMNNAME)T 
         EXCEPT  
         (SELECT  TABLENAME,COLUMNNAME,DATATYPE,NULLABLE FROM #TABLIST_SOURCE 
    INTERSECT 
    SELECT  TABLENAME,COLUMNNAME,DATATYPE,NULLABLE FROM #TABLIST_TARGET))TT1 
    CROSS JOIN (SELECT 'Definition not matching'AS REASONt 
          
    UNION ALL 
     
    SELECT @TargetDb as DATABASENAME, 
        TABLENAME, 
        COLUMNNAME, 
        DATATYPE, 
        NULLABLE, 
        REASON 
    FROM( 
    SELECT * FROM  
    (SELECT TT.TABLENAME,TT.COLUMNNAME,TT.DATATYPE,TT.NULLABLE FROM #TABLIST_TARGET TT 
        INNER JOIN 
         #TABLIST_SOURCE TS ON TS.TABLENAME=TT.TABLENAME AND TS.COLUMNNAME=TT.COLUMNNAME)T 
         EXCEPT 
         (SELECT  TABLENAME,COLUMNNAME,DATATYPE,NULLABLE FROM #TABLIST_TARGET 
    INTERSECT 
    SELECT TABLENAME,COLUMNNAME,DATATYPE,NULLABLE FROM #TABLIST_SOURCE))TAB_NONMATCH 
    CROSS JOIN (SELECT 'Definition not matching' AS REASON)T; 
 
PRINT 'Print index mismatches!'PRINT Replicate('-'Len(@SourceDB) + Len(@TargetDb) + 25); 
 
 
INSERT INTO #IDX_RESULTS(DATABASENAME, TABLE_NAME,IDX_NAME,IDX_COLUMNS,IDX_INCLUDED_COLUMNS,IS_PRIMARY_KEY,IS_UNIQUE,REASON) 
SELECT @SourceDB AS DATABASENAMETABLE_NAME,IDX_NAME,IDX_COLUMNS,IDX_INCLUDED_COLUMNS,IS_PRIMARY_KEY,IS_UNIQUE,REASON FROM  
(SELECT  TABLE_NAME,IDX_NAME,IDX_COLUMNS,IDX_INCLUDED_COLUMNS,IS_PRIMARY_KEY,IS_UNIQUE FROM #IDXLIST_SOURCE 
EXCEPT  
SELECT TS.TABLE_NAME,TS.IDX_NAMETS.IDX_COLUMNS,TS.IDX_INCLUDED_COLUMNS,TS.IS_PRIMARY_KEY,TS.IS_UNIQUE FROM #IDXLIST_SOURCE TS 
INNER JOIN 
#IDXLIST_TARGET TT 
ON TS.TABLE_NAME=TT.TABLE_NAME AND TS.IDX_NAME=TT.IDX_NAMETAB_NONMATCH 
CROSS JOIN (SELECT 'Missing Index n' As Reason)Tab2  
UNION ALL 
SELECT @TargetDb as DATABASENAMETABLE_NAME,IDX_NAME,IDX_COLUMNS,IDX_INCLUDED_COLUMNS,IS_PRIMARY_KEY,IS_UNIQUE,REASON FROM  
(SELECT TABLE_NAME,IDX_NAME,IDX_COLUMNS,IDX_INCLUDED_COLUMNS,IS_PRIMARY_KEY,IS_UNIQUE FROM #IDXLIST_TARGET 
EXCEPT  
SELECT TT.TABLE_NAME,TT.IDX_NAME,TT.IDX_COLUMNS,TT.IDX_INCLUDED_COLUMNS,TT.IS_PRIMARY_KEY,TT.IS_UNIQUE FROM #IDXLIST_TARGET TT 
INNER JOIN 
#IDXLIST_SOURCE TS 
ON TS.TABLE_NAME=TT.TABLE_NAME AND TS.IDX_NAME=TT.IDX_NAMETAB_MATCH  
CROSS JOIN (SELECT 'Missing index ' As Reason)Tab2  
 
--NON MATCHING INDEX 
INSERT INTO #IDX_RESULTS(DATABASENAME,TABLE_NAME,IDX_NAME,IDX_COLUMNS,IDX_INCLUDED_COLUMNS,IS_PRIMARY_KEY,IS_UNIQUE,REASON) 
    SELECT  
        @SourceDB as DATABASENAME, 
        TABLE_NAME, 
        IDX_NAME, 
        IDX_COLUMNS, 
        IDX_INCLUDED_COLUMNS, 
        IS_PRIMARY_KEY, 
        IS_UNIQUE, 
        REASON 
    FROM 
    (SELECT * FROM  
    (SELECT TS.TABLE_NAME, 
        TS.IDX_NAME, 
        TS.IDX_COLUMNS, 
        TS.IDX_INCLUDED_COLUMNS, 
        TS.IS_PRIMARY_KEY, 
        TS.IS_UNIQUE  
        FROM #IDXLIST_SOURCE TS 
        INNER JOIN 
         #IDXLIST_TARGET TT ON TS.TABLE_NAME=TT.TABLE_NAME AND TS.IDX_NAME=TT.IDX_NAME)T 
         EXCEPT  
         (SELECT  TABLE_NAME,IDX_NAME,IDX_COLUMNS,IDX_INCLUDED_COLUMNS,IS_PRIMARY_KEY,IS_UNIQUE FROM #IDXLIST_SOURCE 
    INTERSECT 
    SELECT  TABLE_NAME,IDX_NAME,IDX_COLUMNS,IDX_INCLUDED_COLUMNS,IS_PRIMARY_KEY,IS_UNIQUE FROM #IDXLIST_TARGET))TT1 
    CROSS JOIN (SELECT 'Definition not matching' AS REASONt 
          
    UNION ALL 
     
    SELECT @TargetDb as DATABASENAME, 
        TABLE_NAME, 
        IDX_NAME, 
        IDX_COLUMNS, 
        IDX_INCLUDED_COLUMNS, 
        IS_PRIMARY_KEY, 
        IS_UNIQUE, 
        REASON 
    FROM( 
    SELECT * FROM  
    (SELECT TT.TABLE_NAME, 
        TT.IDX_NAME, 
        TT.IDX_COLUMNS, 
        TT.IDX_INCLUDED_COLUMNS, 
        TT.IS_PRIMARY_KEY, 
        TT.IS_UNIQUE  FROM #IDXLIST_TARGET TT 
        INNER JOIN 
         #IDXLIST_SOURCE TS ON TS.TABLE_NAME=TT.TABLE_NAME AND TS.IDX_NAME=TT.IDX_NAME)T 
         EXCEPT 
         (SELECT  TABLE_NAME,IDX_NAME,IDX_COLUMNS,IDX_INCLUDED_COLUMNS,IS_PRIMARY_KEY,IS_UNIQUE FROM #IDXLIST_TARGET 
    INTERSECT 
    SELECT TABLE_NAME,IDX_NAME,IDX_COLUMNS,IDX_INCLUDED_COLUMNS,IS_PRIMARY_KEY,IS_UNIQUE FROM #IDXLIST_SOURCE))TAB_NONMATCH 
    CROSS JOIN (SELECT 'Definition not matching' AS REASON)T; 
 
 
PRINT 'Print key mismatches!'PRINT Replicate('-'Len(@SourceDB) + Len(@TargetDb) + 25); 
 
INSERT INTO #FK_RESULTS(DATABASENAME, FK_NAME,FK_TABLE,FK_COLUMNS,PK_TABLE,PK_COLUMNS,REASON) 
SELECT @SourceDB AS DATABASENAMEFK_NAME,FK_TABLE,FK_COLUMNS,PK_TABLE,PK_COLUMNS,REASON 
 FROM  
(SELECT FK_NAME,FK_TABLE,FK_COLUMNS,PK_TABLE,PK_COLUMNS FROM #FKLIST_SOURCE 
EXCEPT  
SELECT TS.FK_NAME,TS.FK_TABLE,TS.FK_COLUMNS,TS.PK_TABLE,TS.PK_COLUMNS FROM #FKLIST_SOURCE TS 
INNER JOIN 
#FKLIST_TARGET TT 
ON TS.FK_NAME=TT.FK_NAMETAB_NONMATCH 
CROSS JOIN (SELECT 'Missing Index n' As Reason)Tab2  
 
UNION ALL 
 
SELECT @TargetDb as DATABASENAME,FK_NAME,FK_TABLE,FK_COLUMNS,PK_TABLE,PK_COLUMNS,REASON FROM  
(SELECT FK_NAME,FK_TABLE,FK_COLUMNS,PK_TABLE,PK_COLUMNS FROM #FKLIST_TARGET 
EXCEPT  
SELECT TT.FK_NAME,TT.FK_TABLE,TT.FK_COLUMNS,TT.PK_TABLE,TT.PK_COLUMNS FROM #FKLIST_TARGET TT 
INNER JOIN 
#FKLIST_SOURCE TS 
ON TS.FK_NAME=TT.FK_NAMETAB_MATCH  
CROSS JOIN (SELECT 'Missing key' As Reason)Tab2  
 
 
--NON MATCHING Keys 
INSERT INTO #FK_RESULTS(DATABASENAME, FK_NAME,FK_TABLE,FK_COLUMNS,PK_TABLE,PK_COLUMNS,REASON) 
    SELECT  
        @SourceDB as DATABASENAME, 
        FK_NAME, 
        FK_TABLE, 
        FK_COLUMNS, 
        PK_TABLE, 
        PK_COLUMNS, 
        REASON 
    FROM 
    (SELECT * FROM  
    (SELECT TS.FK_NAME, 
        TS.FK_TABLE, 
        TS.FK_COLUMNS, 
        TS.PK_TABLE, 
        TS.PK_COLUMNS 
        FROM #FKLIST_SOURCE TS 
        INNER JOIN 
         #FKLIST_TARGET TT ON TS.FK_NAME=TT.FK_NAME)T 
         EXCEPT  
         (SELECT FK_NAME,FK_TABLE,FK_COLUMNS,PK_TABLE,PK_COLUMNS FROM #FKLIST_SOURCE 
    INTERSECT 
    SELECT  FK_NAME,FK_TABLE,FK_COLUMNS,PK_TABLE,PK_COLUMNS FROM #FKLIST_TARGET))TT1 
    CROSS JOIN (SELECT 'Definition not matching' AS REASONt 
          
    UNION ALL 
     
    SELECT @TargetDb as DATABASENAME, 
        FK_NAME, 
        FK_TABLE, 
        FK_COLUMNS, 
        PK_TABLE, 
        PK_COLUMNS, 
        REASON 
    FROM( 
    SELECT * FROM  
    (SELECT TT.FK_NAME, 
        TT.FK_TABLE, 
        TT.FK_COLUMNS, 
        TT.PK_TABLE, 
        TT.PK_COLUMNS  FROM #FKLIST_TARGET TT 
        INNER JOIN 
         #FKLIST_SOURCE TS ON TS.FK_NAME=TT.FK_NAME)T 
         EXCEPT 
         (SELECT FK_NAME,FK_TABLE,FK_COLUMNS,PK_TABLE,PK_COLUMNS FROM #FKLIST_TARGET 
    INTERSECT 
    SELECT FK_NAME,FK_TABLE,FK_COLUMNS,PK_TABLE,PK_COLUMNS FROM #FKLIST_SOURCE))TAB_NONMATCH 
    CROSS JOIN (SELECT 'Definition not matching' AS REASON)T; 
     
--Print Final Results     
 
SELECT * FROM #TAB_RESULTS 
SELECT * FROM #IDX_RESULTS 
SELECT * FROM #FK_RESULTS