To run Compara_Table_Structure 'DataBase1','DataBase2'
To run Compara_Table_Structure 'DataBase1','DataBase2'
--- Target: Compare the tables in two database
--- Date: 20/10/2014
--- Author: Andres Michaca Trujillo
USE [SSIS]
GO
/****** Object: StoredProcedure [dbo].[Compara_Table_Structure] Script Date: 29/10/2014 03:21:45 p. m. ******/SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Compara_Table_Structure]
(
@DATABASE1VARCHAR(500),
@DATABASE2VARCHAR(500)
)
AS
BEGIN;
declare @countDataBase1 int
declare @countDatabase2 int
declare @Table_name varchar(50)
DECLARE @SQL VARCHAR(MAX);
SET NOCOUNT on
SET @DATABASE1 = REPLACE(REPLACE(@DATABASE1, '[',''), ']','');
SET @DATABASE2 = REPLACE(REPLACE(@DATABASE2, '[',''), ']','');
SELECT @countDataBase1=count(*) FROM master.dbo.sysdatabases
where ltrim(rtrim(name))=@DATABASE1;
SELECT @countDataBase2=count(*) FROM master.dbo.sysdatabases
where ltrim(rtrim(name))=@DATABASE2;
IF @countDataBase1=0 and @countDataBase2=0
BEGIN;
PRINT 'Las bases de datos a comparar no existe..!!!'
RETURN;
END;
IF @countDataBase1=0
BEGIN;
PRINT 'La base de datos que se compara no existe..!!!'
RETURN;
END;
IF @countDataBase2=0
BEGIN;
PRINT 'La base de datos donde se compara no existe..!!!'
RETURN;
END
IF @countDataBase1=1 and @countDataBase2=1
begin;
Print 'Inicia comparación de las bases de datos ' + @DATABASE1 + ' y ' + @DATABASE2 + ' ..!!!'
end
DECLARE @tablesTABLE
(
Table_namevarchar(50)
)
set @sql= '
select a.table_name from ['+ltrim(rtrim(@DATABASE1))+'].INFORMATION_SCHEMA.tables a
inner join ['+ ltrim(rtrim(@DATABASE2))+'].INFORMATION_SCHEMA.tables b on
a.table_name=b.TABLE_NAME;'
insert into @tables
EXEC (@sql)
DECLARE Tables_compare CURSOR FOR
SELECT Table_name
FROM @tables order by Table_name
OPEN Tables_compare
FETCH NEXT FROM Tables_compare INTO @Table_name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = '
WITH tableA AS (
SELECT COLUMN_NAME,
DATA_TYPE +
case
when CHARACTER_MAXIMUM_LENGTH is null then ''''
else '' (''+CAST(CHARACTER_MAXIMUM_LENGTH as varchar(10))+'')''
end as DATA_TYPE
FROM ['+@DATABASE1+'].INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '''+ltrim(rtrim(@Table_name))+''')
,tableB AS (
SELECT COLUMN_NAME,
DATA_TYPE +
case
when CHARACTER_MAXIMUM_LENGTH is null then ''''
else '' (''+CAST(CHARACTER_MAXIMUM_LENGTH as varchar(10))+'')''
end as DATA_TYPE
FROM ['+@DATABASE2+'].INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '''+ltrim(rtrim(@Table_name))+''')
,TableC AS (
SELECT ''Base compared => ''+'''+ltrim(rtrim(@DATABASE1))+'''+'' - Table=>''+'''+ltrim(rtrim(@Table_name))+''' [DESCRIPTION],
COLUMN_NAME,
DATA_TYPE
FROM (SELECT COLUMN_NAME, DATA_TYPE FROM tableA
EXCEPT
SELECT COLUMN_NAME, DATA_TYPE FROM tableB) TableR)
,tableD AS (
SELECT ''Base where it is compared => ''+'''+ltrim(rtrim(@DATABASE2))+'''+'' - Table=>''+'''+ltrim(rtrim(@Table_name))+''' [DESCRIPTION], COLUMN_NAME, DATA_TYPE
FROM (SELECT COLUMN_NAME, DATA_TYPE FROM tableB
EXCEPT
SELECT COLUMN_NAME, DATA_TYPE FROM tableA) tableR)
SELECT * FROM tableC
UNION
SELECT * FROM tableD;';
EXEC (@SQL)
FETCH NEXT FROM Tables_compare INTO @Table_name
END
CLOSE Tables_compare
DEALLOCATE Tables_compare
set @sql= '
select table_name +' + ''' => de '+ltrim(rtrim(@DATABASE1))+ ' No esta en la base de datos '+ ltrim(rtrim(@DATABASE2))+ ''' [Table_Name] from ['+ltrim(rtrim(@DATABASE1))+'].INFORMATION_SCHEMA.tables a
where table_name not in (select table_name from ['+ ltrim(rtrim(@DATABASE2))+'].INFORMATION_SCHEMA.tables b)
order by a.table_name;'
exec (@sql)
set @sql= '
select table_name +' + ''' => de '+ltrim(rtrim(@DATABASE2))+ ' No esta en la base de datos '+ ltrim(rtrim(@DATABASE1))+ ''' [Table_Name] from ['+ltrim(rtrim(@DATABASE2))+'].INFORMATION_SCHEMA.tables a
where table_name not in (select table_name from ['+ ltrim(rtrim(@DATABASE1))+'].INFORMATION_SCHEMA.tables b)
order by a.table_name;'
exec (@sql)
SET NOCOUNT off
end
-- to run Compara_Table_Structure 'SSIS','SSISCOPIA'