Franklin
Franklin

Reputation: 905

Compare 2 different tables columns from 2 different databases

I have a requirement to compare different tables' columns from 2 different databases, in order to add columns to the master tables based on the requirement.

For example:

Assume in master database I have created one table like:

create table test(id int,name varchar(10))

Assume in test database I have created one table like

create table testings(id int,name varchar(20), sal int)

now I have to compare 2 table columns

I don't want to use red-gate tools.

Can anyone help me?

Upvotes: 6

Views: 45147

Answers (4)

wwmbes
wwmbes

Reputation: 304

This is a GPL Java program I wrote for comparing data in any two tables, with a common key and common columns, across any two heterogeneous databases using JDBC: https://sourceforge.net/projects/metaqa/

It intelligently forgives (numeric, string and date) data type differences by reducing them to a common format. The output is a sparse tab delimited file with .xls extension for use in a spreadsheet.

Upvotes: 0

Phill C
Phill C

Reputation: 606

Is it just red-gate tools you don’t want to use or basically any third party tool? Why not, even if you don’t have the budget to buy you can still use this in trial mode to get the job done?

We’ve been using Apex Diff tool but there are many more out there.

With so many tools available you can probably run all one by one in trial mode for months…

Knowing system tables and how to do this natively is great but it’s just too time consuming...

Upvotes: 11

user2232061
user2232061

Reputation: 11

To compare columns use INFORMATION_SCHEMA.COLUMNS table in a SQL SERVER.

This is the exmaple:

select column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='your_table_name1'
except
select column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='your_table_name2'

Upvotes: 1

Mahmoud Gamal
Mahmoud Gamal

Reputation: 79929

You can use the EXCEPT or INTERSECT set operators for this. Like so:

SELECT id, name FROM master.dbo.test
EXCEPT  -- or INTERSECT
SELECT id, name FROM test.dbo.testings

This will give you:

  • EXCEPT: returns any distinct values from the left query that are not also found on the right query.

  • INTERSECT: returns any distinct values that are returned by both the query on the left and right sides of the INTERSECT operand.

In your case, since you want to select from two different databases, you have to use a fully qualified table names. They have to be in the form database.schema.object_name.

Update: If you want compare the two tables columns' names, not the data itself, you have to work with the metadata tables to compare the columns' names the same way with EXCEPT.

For instance, suppose you have two databases:

  • Test database contains the table:

    create table test(id int, name varchar(10), dep varchar(50));
    

    and another database:

  • anotherdatabase database contains the table:

    create table testings(id int,name varchar(20), sal int);
    

And you want to compare the two tables' columns and get the tables that don't exist in the other table, in our example you need to get sal and dep.

Then you can do this:

SELECT ColumnName
FROM
(
    SELECT  c.name "ColumnName"
    FROM test.sys.tables t
    INNER JOIN test.sys.all_columns c 
            ON t.object_id = c.object_id
    INNER JOIN test.sys.types ty 
            ON c.system_type_id = ty.system_type_id
    WHERE t.name = 'test'
    EXCEPT
    SELECT  c.name
    FROM anotherdatabase.sys.tables t
    INNER JOIN anotherdatabase.sys.all_columns c 
            ON t.object_id = c.object_id
    INNER JOIN anotherdatabase.sys.types ty 
            ON c.system_type_id = ty.system_type_id
    WHERE t.name = 'testings'
) t1
UNION ALL
SELECT ColumnName
FROM
(
    SELECT  c.name ColumnName
    FROM anotherdatabase.sys.tables t
    INNER JOIN anotherdatabase.sys.all_columns c  
            ON t.object_id = c.object_id
    INNER JOIN anotherdatabase.sys.types ty      
            ON c.system_type_id = ty.system_type_id
    WHERE t.name = 'testings'
    EXCEPT
    SELECT  c.name
    FROM test.sys.tables t
    INNER JOIN test.sys.all_columns c 
            ON t.object_id = c.object_id
    INNER JOIN test.sys.types ty 
            ON c.system_type_id = ty.system_type_id
    WHERE t.name = 'test'
) t2;

This should give you:

enter image description here

Note that: I joined the tables:

with the table:

to get only those columns that have the same data type. If you didn't joined this table, then if two columns have the same name but different data type, they would be the same.

Upvotes: 9

Related Questions