Compare the data of 2 Tables (Updated)
The SP compares the data in 2 tables and reports the different data. Tables could be from different servers, different databases or different schemas.
This accepts 7 parameters
1, 2: Name of the 2 tables
3 : List only the differences
4. : Compare only the structure
5. : Check timestamp fields too
6. : Verbose mode
7. : Field List
Thanks to:
iecdba (Sript id 452) for giving the idea.
IF Exists(Select id from sysobjects where id = object_id('sp_Compare2Tables') and type ='P')
Drop Procedure sp_Compare2Tables
GO
/*
sp_Compare2Tables
The SP compares the structure & data in 2 tables.
Tables could be from different servers, different databases or different schemas.
Parameters:
1. @TableName1 - Name of the table to be checked.
2. @TableName2 - Name of the table to be checked.
3. @ListDiff - Bit to list the differences
4. @StructureOnly - Bit to compare only the structure
5. @CheckTimeStamp - Bit to check the timestampfields too
6. @Verbose - Bit To Print the Queries Used
7. @Fields - Optional List of fields which to be checked
Assumptions: The length of the field list and other dynamic strings should not exceed 8000 characters
Both tables have primary keys
Primary key combination is same for both tables
Paramenter 1, 2: Table name (With optional server name, database name, Schema name seperated with .)
Eg. Preethi.Inventory.Dbo.TranHeader, Preethi.Test.dbo.Tran
Any of the first 3 parts could be omitted.
Inventory.DBO.TranHeader, INV.TranHeader and TranHeader are valid
Note:
When using multi part name include them in Single Quotations
(Eg. 'Inventory.DBO.TranHeader', 'INV.TranHeader')
Parameter 3: List the differences
IF True it will list all the different fields (in case of structural difference)
or all the different entries (in case of data differences)
Default is 1 (List the differences)
Parameter 4: Compare only the structure
Default=0 (Compare structure & data -if structure is same.)
Parameter 5: Check timestamp fields
Default =0 (Ignore timestamp columns)
Parameter 6: Verbose Mode (Print the queries too
Default =0 (Donot print the queries)
Parameter 7: List of fields which to be checked
If omitted, all fields will be checked. if parameter 5 is set to 0 timestamp field will be omitted.
If specified, checktimestamp value be ignored
Created by G.R.Preethiviraj Kulasingham
Written on : August 17, 2002
Modified on : february 19, 2004
*/
CREATE PROC sp_Compare2Tables
@TableName1 sysName ,
@TableName2 sysName ,
@ListDiff bit = 1 ,
@StructureOnly bit =0 ,
@CheckTimeStamp bit =0 ,
@Verbose bit =0 ,
@Fields varchar(4000)=''
AS
SET NOCOUNT ON
SET ANSI_WARNINGS ON
SET ANSI_NULLS ON
declare @SQLStr nvarchar(4000), @OrderBy varchar(4000), @ConditionList varchar(4000), @FieldList varchar(4000)
Declare @SQL1 varchar(8000), @SQL2 varchar(8000), @SQL3 varchar(8000), @SQL4 varchar(8000)
declare @SvrName1 sysname, @DBName1 sysname, @Schema1 Sysname, @Table1 Sysname
Declare @SvrName2 sysname, @DBName2 sysname, @Schema2 sysname, @Table2 sysname
declare @Int1 int, @Int2 int, @Int3 int, @Int4 int
--Declare @TimeStamp bit
--set @Table1 = @TableName1
set @SvrName1 = ISNULL(PARSENAME(@TableName1,4), @@SERVERNAME)
Set @DBName1 = ISNULL(PARSENAME(@TableName1,3), DB_NAME())
set @Schema1 = ISNULL(PARSENAME(@TableName1,2), CURRENT_USER)
set @Table1= PARSENAME(@TableName1,1)
set @SvrName2 = ISNULL(PARSENAME(@TableName2,4), @@SERVERNAME)
Set @DBName2 = ISNULL(PARSENAME(@TableName2,3), DB_NAME())
set @Schema2 = ISNULL(PARSENAME(@TableName2,2), CURRENT_USER)
set @Table2 = PARSENAME(@TableName2,1)
/*
Select @SvrName1 as [Server], @DBName1 [Data Base], @Schema1 [Schema], @Table1 [Table]
union
Select @SvrName2, @DBName2, @Schema2, @Table2
*/-- Check for the existance of specified Servers, databases, schemas and tables
IF @SvrName1<>@@SERVERNAME
IF not exists (select * FROM master.dbo.sysservers where srvname = @SvrName1)
BEGIN
PRINT 'There is no linked server named '+@SvrName1+'. Termination of Procedure.'
RETURN
END
Declare @Name sysname
select @Name=null, @SQLStr = N'Select @Name=Name FROM ['+@SvrName1+'].master.dbo.sysdatabases where name ='''+ @DBName1+''''
EXECUTE sp_ExecuteSQL @SQLStr, N'@Name sysname output', @Name output
IF @Name is NULL
BEGIN
PRINT 'There is no database named '+@DBName1+'. Termination of Procedure.'
RETURN
END
select @Name=null, @SQLStr = N'Select @Name=name FROM ['+@SvrName1+'].['+@DBName1+'].dbo.sysusers where name ='''+ @Schema1+''''
EXECUTE sp_ExecuteSQL @SQLStr, N'@Name sysname output', @Name output
IF @Name is NULL
BEGIN
PRINT 'There is no schema named '+@Schema1+' in the specified Database. Termination of Procedure.'
RETURN
END
select @Name=null, @SQLStr = N'Select @Name=o.Name FROM ['+@SvrName1+'].['+@DBName1+'].dbo.sysobjects O, ['+@SvrName1+'].['+@DBName1+'].dbo.sysusers U Where O.uid=U.Uid and U.Name =''' + @Schema1 +''' and O.name=''' +@Table1+''' and xtype in (''U'', ''V'')'
EXECUTE sp_ExecuteSQL @SQLStr, N'@Name sysname output', @Name output
IF @Name is NULL
BEGIN
PRINT 'There is no Table named '+@Table1+'. END of work.'
RETURN
END
IF @SvrName2<>@@SERVERNAME
IF not exists (select * FROM master.dbo.sysservers where srvname = @SvrName2)
BEGIN
PRINT 'There is no linked server named '+@SvrName2+'. Termination of Procedure.'
RETURN
END
select @Name=null, @SQLStr = 'Select @Name=name FROM ['+@SvrName2+'].master.dbo.sysdatabases where name ='''+ @DBName2+''''
EXECUTE sp_ExecuteSQL @SQLStr, N'@Name sysname output', @Name output
IF @Name is NULL
BEGIN
PRINT 'There is no database named '+@DBName2+'. Termination of Procedure.'
RETURN
END
select @Name=null, @SQLStr = 'Select @Name=name FROM ['+@SvrName2+'].['+@DBName2+'].dbo.sysusers where name ='''+ @Schema2+''''
EXECUTE sp_ExecuteSQL @SQLStr, N'@Name sysname output', @Name output
IF @Name is NULL
BEGIN
PRINT 'There is no schema named '+@Schema2+'in the specified Database. Termination of Procedure.'
RETURN
END
select @Name=null, @SQLStr = 'Select @Name=o.name FROM ['+@SvrName2+'].['+@DBName2+'].dbo.sysobjects O, ['+@SvrName2+'].['+@DBName2+'].dbo.sysusers U Where O.uid=U.Uid and U.Name =''' + @Schema2 +''' and O.name=''' +@Table2+''' and xtype in (''U'', ''V'')'
EXECUTE sp_ExecuteSQL @SQLStr, N'@Name sysname output', @Name output
IF @Name is NULL
BEGIN
PRINT 'There is no Table named '+@Table2+'. END of work.'
RETURN
END
-- Check whether both tables are same.
IF (@SvrName1 + @DbName1 + @Schema1 + @Table1)=(@SvrName2 + @DbName2 + @Schema2 + @Table2)
BEGIN
PRINT 'Both Tables should be different. Termination of Procedure'
RETURN
END
-- Check whether the structure of both tables are same.
-- Method: Get the tables with column data
-- Select the no of rows in each and in union.
-- If both are same they are same
Print '--Comparing the structure started at '+Convert(varchar(35), GetDate(),109)
Create Table #TableColumns
(
TABLE_SERVER sysname NOT NULL,
TABLE_CATALOG sysname NOT NULL,
TABLE_SCHEMA sysname NOT NULL,
TABLE_NAME sysname NOT NULL,
COLUMN_NAME sysname NOT NULL,
ORDINAL_POSITION smallint NOT NULL,
IS_NULLABLE bit NOT NULL,
DATA_TYPE sysname NOT NULL,
CHARACTER_MAXIMUM_LENGTH int NULL,
CHARACTER_OCTET_LENGTH int NULL,
NUMERIC_PRECISION tinyint NULL,
NUMERIC_PRECISION_RADIX smallint NULL,
NUMERIC_SCALE int NULL,
DATETIME_PRECISION smallint NULL
)
Create Table #Table_Index
(
ColumnName sysname NOT NULL,
OrderID Int NOT NULL
)
Create Table #ROWCount_Table
(
Int1 int NOT NULL,
Int2 int NULL,
Int3 int NULL,
Int4 int NULL
)
IF @Verbose=1
PRINT '
Create Table #TableColumns
(
TABLE_SERVER sysname NOT NULL,
TABLE_CATALOG sysname NOT NULL,
TABLE_SCHEMA sysname NOT NULL,
TABLE_NAME sysname NOT NULL,
COLUMN_NAME sysname NOT NULL,
ORDINAL_POSITION smallint NOT NULL,
IS_NULLABLE bit NOT NULL,
DATA_TYPE sysname NOT NULL,
CHARACTER_MAXIMUM_LENGTH int NULL,
CHARACTER_OCTET_LENGTH int NULL,
NUMERIC_PRECISION tinyint NULL,
NUMERIC_PRECISION_RADIX smallint NULL,
NUMERIC_SCALE int NULL,
DATETIME_PRECISION smallint NULL
)
Create Table #Table_Index
(
ColumnName sysname NOT NULL,
OrderID Int NOT NULL
)
Create Table #ROWCount_Table
(
Int1 int NOT NULL,
Int2 int NULL,
Int3 int NULL,
Int4 int NULL
)
'
SET @SQLStr = 'Insert into #TableColumns
SELECT '''+@SvrName1+''', '''+@DBName1 +''',
usr.name, obj.name,
Col.name,
col.colid,
col.isnullable,
spt_dtp.LOCAL_TYPE_NAME,
convert(int, OdbcPrec(col.xtype, col.length, col.xprec) + spt_dtp.charbin),
convert(int, spt_dtp.charbin +
case when spt_dtp.LOCAL_TYPE_NAME in (''nchar'', ''nvarchar'', ''ntext'')
then 2*OdbcPrec(col.xtype, col.length, col.xprec)
else OdbcPrec(col.xtype, col.length, col.xprec)
end),
nullif(col.xprec, 0),
spt_dtp.RADIX,
col.scale,
spt_dtp.SQL_DATETIME_SUB
FROM ['+@SvrName1+'].['+@DBName1+'].dbo.sysobjects obj,
['+@SvrName1+'].master.dbo.spt_datatype_info spt_dtp,
['+@SvrName1+'].['+@DBName1 +'].dbo.systypes typ,
['+@SvrName1+'].['+@DBName1 +'].dbo.sysusers usr,
['+@SvrName1+'].['+@DBName1 +'].dbo.syscolumns col
WHERE
obj.id = col.id
AND obj.uid=usr.uid
AND typ.xtype = spt_dtp.ss_dtype
AND (spt_dtp.ODBCVer is null or spt_dtp.ODBCVer = 2)
AND obj.xtype in (''U'', ''V'')
AND col.xusertype = typ.xusertype
AND (spt_dtp.AUTO_INCREMENT is null or spt_dtp.AUTO_INCREMENT = 0)
AND obj.name =''' + @Table1+ ''' and usr.name ='''+@Schema1+''''
EXECUTE sp_ExecuteSQL @SQLStr
IF @Verbose=1
Print @SQLStr
set @SQLStr = 'Insert into #TableColumns
SELECT '''+@SvrName2+''', '''+@DbName2 +''',
usr.name, obj.name,
Col.name,
col.colid,
col.isnullable,
spt_dtp.LOCAL_TYPE_NAME,
convert(int, OdbcPrec(col.xtype, col.length, col.xprec) + spt_dtp.charbin),
convert(int, spt_dtp.charbin +
case when spt_dtp.LOCAL_TYPE_NAME in (''nchar'', ''nvarchar'', ''ntext'')
then 2*OdbcPrec(col.xtype, col.length, col.xprec)
else OdbcPrec(col.xtype, col.length, col.xprec)
end),
nullif(col.xprec, 0),
spt_dtp.RADIX,
col.scale,
spt_dtp.SQL_DATETIME_SUB
FROM ['+@SvrName2+'].['+@DBName2+'].dbo.sysobjects obj,
['+@SvrName2+'].master.dbo.spt_datatype_info spt_dtp,
['+@SvrName2+'].['+@DBName2 +'].dbo.systypes typ,
['+@SvrName2+'].['+@DBName2 +'].dbo.sysusers usr,
['+@SvrName2+'].['+@DBName2 +'].dbo.syscolumns col
WHERE
obj.id = col.id
AND obj.uid=usr.uid
AND typ.xtype = spt_dtp.ss_dtype
AND (spt_dtp.ODBCVer is null or spt_dtp.ODBCVer = 2)
AND obj.xtype in (''U'', ''V'')
AND col.xusertype = typ.xusertype
AND (spt_dtp.AUTO_INCREMENT is null or spt_dtp.AUTO_INCREMENT = 0)
AND obj.name =''' + @Table2+ ''' and usr.name ='''+@Schema2+''''
EXECUTE sp_ExecuteSQL @SQLStr
IF @Verbose=1
Print @SQLStr
IF @Fields<>''
Delete From #TableColumns Where CharIndex(COLUMN_NAME, @Fields)=0
IF EXISTS(SELECT COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
CHARACTER_OCTET_LENGTH,
NUMERIC_PRECISION,
NUMERIC_PRECISION_RADIX,
NUMERIC_SCALE,
DATETIME_PRECISION,
COUNT(*) AS NUMBERS
FROM #TableColumns
GROUP BY COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
CHARACTER_OCTET_LENGTH,
NUMERIC_PRECISION,
NUMERIC_PRECISION_RADIX,
NUMERIC_SCALE,
DATETIME_PRECISION
HAVING COUNT(*)=1)
BEGIN
PRINT 'The Structure of the tables are different. Termination of Procedure.'
IF @ListDiff =1
SELECT A.*
FROM #TableColumns A,
(SELECT COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
CHARACTER_OCTET_LENGTH,
NUMERIC_PRECISION,
NUMERIC_PRECISION_RADIX,
NUMERIC_SCALE,
DATETIME_PRECISION,
COUNT(*) as NUMBERS
FROM #TableColumns
GROUP BY COLUMN_NAME,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
CHARACTER_OCTET_LENGTH,
NUMERIC_PRECISION,
NUMERIC_PRECISION_RADIX,
NUMERIC_SCALE,
DATETIME_PRECISION
HAVING COUNT(*) =1) B
WHERE A.COLUMN_NAME = B.COLUMN_NAME AND
A.DATA_TYPE = B.DATA_TYPE AND
(ISNULL(A.CHARACTER_MAXIMUM_LENGTH,0)=ISNULL(B.CHARACTER_MAXIMUM_LENGTH,0)) AND
(ISNULL(A.NUMERIC_PRECISION, 0)=ISNULL(B.NUMERIC_PRECISION,0)) AND
(ISNULL(A.NUMERIC_PRECISION_RADIX, 0)=ISNULL(B.NUMERIC_PRECISION_RADIX,0)) AND
(ISNULL(A.NUMERIC_SCALE, 0)=ISNULL(B.NUMERIC_SCALE,0)) AND
(ISNULL(A.DATETIME_PRECISION, 0)=ISNULL(B.DATETIME_PRECISION,0))
ORDER BY A.ORDINAL_POSITION
DROP TABLE #ROWCount_Table
DROP TABLE #TableColumns
Print '-- Comparing the structure completed at '+Convert(varchar(35), GetDate(),109)
RETURN
END
ELSE
Print '-- Comparing the structure completed at '+Convert(varchar(35), GetDate(),109)
IF @StructureOnly=1
BEGIN
DROP TABLE #ROWCount_Table
DROP TABLE #TableColumns
RETURN
END
-----------------------------------------------------------------------------------------------
-- Check for the presence of timestamp column
-----------------------------------------------------------------------------------------------
-- NOTE: This First Method is a simple method to check Whether Both Tables are Identitical. --
Print '-- Comparing the data started at '+Convert(varchar(35), GetDate(),109)
SELECT @ConditionList='', @FieldList=''
IF @Fields=''
BEGIN
IF @CheckTimeStamp =1
BEGIN
IF NOT Exists(Select * FROM #TableColumns Where DATA_Type='TIMESTAMP')
SET @CheckTimeStamp=0
END
IF Exists(Select * FROM #TableColumns Where (DATA_Type<>'TIMESTAMP' or @CheckTimeStamp=1 ) and
TABLE_SERVER = @SvrName1 AND TABLE_CATALOG = @DBName1 and TABLE_Schema =@Schema1 and TABLE_Name= @Table1)
SELECT @FieldList=@FieldList+',T.'+COLUMN_NAME,
@ConditionList= case IS_NULLABLE
WHEN 1 THEN @ConditionList +'AND((T.'+COLUMN_NAME+ '=A.'+COLUMN_NAME + ')OR(T.'+COLUMN_NAME+' IS NULL AND A.'+COLUMN_NAME+' IS NULL))'
ELSE @ConditionList +'AND(T.'+COLUMN_NAME+ '=A.'+COLUMN_NAME +')'
END
FROM #TableColumns
WHERE TABLE_SERVER = @SvrName1 AND
TABLE_CATALOG = @DBName1 and
TABLE_Schema =@Schema1 and
TABLE_Name= @Table1 and
(DATA_Type<>'TIMESTAMP' or @CheckTimeStamp=1)
ORDER BY ORDINAL_POSITION
END
ELSE
BEGIN
IF Exists(Select * FROM #TableColumns Where CharIndex(COLUMN_NAME, @Fields)>0 and
TABLE_SERVER = @SvrName1 AND TABLE_CATALOG = @DBName1 and TABLE_Schema =@Schema1 and TABLE_Name= @Table1)
SELECT @FieldList=@FieldList+',T.'+COLUMN_NAME,
@ConditionList= case IS_NULLABLE
WHEN 1 THEN @ConditionList +'AND((T.'+COLUMN_NAME+ '=A.'+COLUMN_NAME + ')OR(T.'+COLUMN_NAME+' IS NULL AND A.'+COLUMN_NAME+' IS NULL))'
ELSE @ConditionList +'AND(T.'+COLUMN_NAME+ '=A.'+COLUMN_NAME +')'
END
FROM #TableColumns
WHERE TABLE_SERVER = @SvrName1 AND
TABLE_CATALOG = @DBName1 and
TABLE_Schema =@Schema1 and
TABLE_Name= @Table1 and
CharIndex(COLUMN_Name, @Fields)>0
ORDER BY ORDINAL_POSITION
END
SET @FieldList= SUBSTRING(@FieldList, 2, LEN(@FieldList)-1)
SET @ConditionList= SUBSTRING(@ConditionList, 4, LEN(@ConditionList)-3)
SET @SQLStr='
Insert Into #Table_Index (ColumnName, OrderID)
select C.Name, k.keyno
from ['+@SvrName1+'].['+@DbName1+'].dbo.sysobjects O,
['+@SvrName1+'].['+@DbName1+'].dbo.sysindexes I,
['+@SvrName1+'].['+@DbName1+'].dbo.sysindexkeys K,
['+@SvrName1+'].['+@DbName1+'].dbo.syscolumns C,
['+@SvrName1+'].['+@DbName1+'].dbo.sysusers U
where O.uid = u.uid and u.name = '''+@Schema1+''' and O.name ='''+@Table1+''' and I.id = O.id and
(I.status & 0x800) = 0x800 and I.indid = k.indid and O.id = k.id and k.colid =C.Colid and C.id =O.id
'
EXECUTE sp_ExecuteSQL @SQLStr
IF @Verbose=1
Print @SQLStr
SET @OrderBy =''
IF Exists(Select * from #Table_Index )
Select @OrderBy = @OrderBy+',T.'+ColumnName From #Table_Index Order By OrderID
IF @OrderBy ='' --No Primary Index Found
SET @OrderBy =@FieldList
ELSE
SET @OrderBy= SUBSTRING(@OrderBy, 2, LEN(@OrderBy)-1)
SET @SQLStr='
INSERT INTO #ROWCount_Table Select i.[rows],0,0, 0
FROM ['+@SvrName1+'].['+@DBName1+'].dbo.sysindexes i,
['+@SvrName1+'].['+@DBName1+'].dbo.sysObjects o,
['+@SvrName1+'].['+@DBName1+'].dbo.sysusers u
Where o.id=i.id and u.uid = o.uid and i.indid<2 and
u.name='''+@Schema1+''' and o.name ='''+@Table1+'''
update #ROWCount_Table set Int2 =
(
Select i.[rows]
FROM ['+@SvrName2+'].['+@DBName2+'].dbo.sysindexes i,
['+@SvrName2+'].['+@DBName2+'].dbo.sysObjects o,
['+@SvrName2+'].['+@DBName2+'].dbo.sysusers u
Where o.id=i.id and u.uid = o.uid and i.indid<2 and
u.name='''+@Schema2+''' and o.name ='''+@Table2+''')
Update #ROWCount_Table Set Int3=
(
Select Count(1) FROM
(
Select '+ @FieldList +'
FROM ['+@SvrName1+'].['+@DBName1+'].['+@Schema1+'].['+@Table1+'] T
UNION
Select '+ @FieldList +'
FROM ['+@SvrName2+'].['+@DBName2+'].['+@Schema2+'].['+@Table2+'] T
) A
)
Update #ROWCount_Table Set Int4=
(
Select Count(1) FROM
(
Select '+ @OrderBy +'
FROM ['+@SvrName1+'].['+@DBName1+'].['+@Schema1+'].['+@Table1+'] T
UNION
Select '+ @OrderBy +'
FROM ['+@SvrName2+'].['+@DBName2+'].['+@Schema2+'].['+@Table2+'] T
) A
)'
EXECUTE sp_ExecuteSQL @SQLStr
IF @Verbose=1
Print @SQLStr
Select @Int1=Int1, @Int2=Int2, @Int3=Int3, @Int4=Int4 FROM #ROWCount_Table
IF @Int1=@Int3 and @Int2=@Int3
BEGIN
PRINT '-- Both Tables are identitical.'
DROP TABLE #ROWCount_Table
DROP TABLE #TableColumns
Print '-- Comparing the data completed at '+Convert(varchar(35), GetDate(),109)
RETURN
END
PRINT '
-- Both Tables are having different data
------------------------------------------------------
-- No. of records in '+@TableName1+ ' are '+Convert(Varchar(20), @Int1)+'.
-- No. of records in '+@TableName2+ ' are '+Convert(Varchar(20), @Int2)+'.
-- No. of records common in both are '+Convert(Varchar(20), @Int1+@int2-@Int3)+'.
-- No. of unmatched records in '+@TableName1+ ' are '+Convert(Varchar(20),@int3-@Int2)+'.
-- No. of unmatched records in '+@TableName2+ ' are '+Convert(Varchar(20),@int3-@Int1)+'.
-- No. of New records in '+@TableName1+ ' are '+Convert(varchar(20), @Int4-@Int2)+'.
-- No. of New records in '+@TableName2+ ' are '+Convert(varchar(20), @Int4-@Int1)+'.
-- No. of modified but existing records are '+Convert(varchar(20), @Int3-@Int4)+'.
------------------------------------------------------
-- Comparing the data step 1 completed at '+Convert(varchar(35), GetDate(),109)
IF @ListDiff = 0
BEGIN
DROP TABLE #Table_Index
DROP TABLE #ROWCount_Table
DROP TABLE #TableColumns
RETURN
END
------------------------------------------------------------------------------------------
-- Now the Tables are not identitical. Now List all the Rows that are different --
------------------------------------------------------------------------------------------
IF @SvrName1=@@SERVERNAME SET @SvrName1='' ELSE SET @SvrName1='['+@SvrName1+'].'
IF @SvrName2=@@SERVERNAME SET @SvrName2='' ELSE SET @SvrName2='['+@SvrName2+'].'
IF @SvrName1='' AND @DBName1=DB_NAME() SET @DBName1='' ELSE SET @DBName1='['+@DBName1+'].'
IF @SvrName2='' AND @DBName2=DB_NAME() SET @DBName2='' ELSE SET @DBName2='['+@DBName2+'].'
IF @SvrName1='' AND @DBName1='' and @Schema1=CURRENT_USER SET @Schema1='' ELSE SET @Schema1='['+@Schema1+'].'
IF @SvrName2='' AND @DBName2='' and @Schema2=CURRENT_USER SET @Schema2='' ELSE SET @Schema2='['+@Schema2+'].'
IF (@CheckTimeStamp=1 or @Fields<>'')
BEGIN
SELECT @SQL1='
Select Min(A) TABLE_NAME, '+ @FieldList+' FROM
', @SQL2= ' (Select '''+@TableName1+''' A, '+ @FieldList+ ' FROM '+@SvrName1+@DBName1+@Schema1+'['+@Table1+'] T
UNION ALL
', @SQL3= ' Select '''+@TableNAme2+''', '+ @FieldList+' FROM '+@SvrName2+@DBName2+@Schema2+'['+@Table2+'] T
) T
'
END
ELSE
SELECT @SQL1='
Select Min(A) TABLE_NAME, '+ @FieldList+' FROM
', @SQL2=' (Select '''+@TableName1+''' A, T.* FROM '+@SvrName1+@DBName1+@Schema1+'['+@Table1+'] T
UNION ALL
Select '''+@TableName2+''' Table_Name, T.* FROM '+@SvrName2+@DBName2+@Schema2+'['+@Table2+'] T
) T
'
SET @SQL4=' Group By '+ @FieldList + ' Having Count(*)<2
Order By '
IF @Verbose=1
PRINT @SQL1+@SQL2+@SQL3+@SQL4+@OrderBy
IF LEN(@SQL1+@SQL2+@SQL3+@SQL4+@OrderBy)<=4000
BEGIN
SET @SQLStr = @SQL1+@SQL2+@SQL3+@SQL4+@OrderBy
EXECUTE sp_ExecuteSQL @SQLStr
END
ELSE
EXECUTE (@SQL1+@SQL2+@SQL3+@SQL4+@OrderBy)
DROP TABLE #Table_Index
DROP TABLE #ROWCount_Table
DROP TABLE #TableColumns
PRINT '-- Comparing the data step 2 completed at '+Convert(varchar(35), GetDate(),109)