How to compare data between two table in different databases using Sql Server 2008?

前端 未结 9 2249
一生所求
一生所求 2020-12-13 17:41

I have two database\'s, named DB1 and DB2 in Sql server 2008. These two database\'s have the same tables and same table data also. However, I want to check if there are an

相关标签:
9条回答
  • 2020-12-13 18:05

    In order to compare two databases, I've written the procedures bellow. If you want to compare two tables you can use procedure 'CompareTables'. Example :

    EXEC master.dbo.CompareTables 'DB1', 'dbo', 'table1', 'DB2', 'dbo', 'table2'
    

    If you want to compare two databases, use the procedure 'CompareDatabases'. Example :

    EXEC master.dbo.CompareDatabases 'DB1', 'DB2'
    

    Note : - I tried to make the procedures secure, but anyway, those procedures are only for testing and debugging. - If you want a complete solution for comparison use third party like (Visual Studio, ...)

    USE [master]
    GO
    
    create proc [dbo].[CompareDatabases]
        @FirstDatabaseName nvarchar(50),
        @SecondDatabaseName nvarchar(50)
        as
    begin
        -- Check that databases exist
        if not exists(SELECT name FROM sys.databases WHERE name=@FirstDatabaseName)
            return 0
        if not exists(SELECT name FROM sys.databases WHERE name=@SecondDatabaseName)
            return 0
    
        declare @result table (TABLE_NAME nvarchar(256))
        SET NOCOUNT ON
        insert into @result EXEC('(Select distinct TABLE_NAME from ' + @FirstDatabaseName  + '.INFORMATION_SCHEMA.COLUMNS '
                                        +'Where TABLE_SCHEMA=''dbo'')'
                                + 'intersect'
                                + '(Select distinct TABLE_NAME from ' + @SecondDatabaseName  + '.INFORMATION_SCHEMA.COLUMNS '
                                        +'Where TABLE_SCHEMA=''dbo'')')
    
        DECLARE @TABLE_NAME nvarchar(256)
        DECLARE curseur CURSOR FOR
            SELECT TABLE_NAME FROM @result
        OPEN curseur
        FETCH curseur INTO @TABLE_NAME
            WHILE @@FETCH_STATUS = 0
                BEGIN
                    print 'TABLE : ' + @TABLE_NAME
                    EXEC master.dbo.CompareTables @FirstDatabaseName, 'dbo', @TABLE_NAME, @SecondDatabaseName, 'dbo', @TABLE_NAME
                    FETCH curseur INTO @TABLE_NAME
                END
            CLOSE curseur
        DEALLOCATE curseur
        SET NOCOUNT OFF
    end
    GO
    

    .

    USE [master]
    GO
    
    CREATE PROC [dbo].[CompareTables]
        @FirstTABLE_CATALOG nvarchar(256),
        @FirstTABLE_SCHEMA nvarchar(256),
        @FirstTABLE_NAME nvarchar(256),
        @SecondTABLE_CATALOG nvarchar(256),
        @SecondTABLE_SCHEMA nvarchar(256),
        @SecondTABLE_NAME nvarchar(256)
        AS
    BEGIN
        -- Verify if first table exist
        DECLARE @table1 nvarchar(256) = @FirstTABLE_CATALOG + '.' + @FirstTABLE_SCHEMA + '.' + @FirstTABLE_NAME
        DECLARE @return_status int
        EXEC @return_status = master.dbo.TableExist @FirstTABLE_CATALOG, @FirstTABLE_SCHEMA, @FirstTABLE_NAME
        IF @return_status = 0
            BEGIN
                PRINT @table1 + ' : Table Not FOUND'
                RETURN 0
            END
    
    
    
        -- Verify if second table exist
        DECLARE @table2 nvarchar(256) = @SecondTABLE_CATALOG + '.' + @SecondTABLE_SCHEMA + '.' + @SecondTABLE_NAME
        EXEC @return_status = master.dbo.TableExist @SecondTABLE_CATALOG, @SecondTABLE_SCHEMA, @SecondTABLE_NAME
        IF @return_status = 0
            BEGIN
                PRINT @table2 + ' : Table Not FOUND'
                RETURN 0
            END
    
        -- Compare the two tables
        DECLARE @sql AS NVARCHAR(MAX)
        SELECT @sql = '('
                    + '(SELECT ''' + @table1 + ''' as _Table, * FROM ' + @FirstTABLE_CATALOG + '.' + @FirstTABLE_SCHEMA + '.' + @FirstTABLE_NAME + ')'
                    + 'EXCEPT'
                    + '(SELECT ''' + @table1 + ''' as _Table, * FROM ' + @SecondTABLE_CATALOG + '.' + @SecondTABLE_SCHEMA + '.' + @SecondTABLE_NAME + ')'
                    + ')'
                    + 'UNION'
                    + '('
                    + '(SELECT ''' + @table2 + ''' as _Table, * FROM ' + @SecondTABLE_CATALOG + '.' + @SecondTABLE_SCHEMA + '.' + @SecondTABLE_NAME + ')'
                    + 'EXCEPT'
                    + '(SELECT ''' + @table2 + ''' as _Table, * FROM ' + @FirstTABLE_CATALOG + '.' + @FirstTABLE_SCHEMA + '.' + @FirstTABLE_NAME + ')'
                    + ')'
        DECLARE @wrapper AS NVARCHAR(MAX) = 'if exists (' + @sql + ')' + char(10) + '    (' + @sql + ')ORDER BY 2'
        Exec(@wrapper)
    END
    GO
    

    .

    USE [master]
    GO
    
    CREATE PROC [dbo].[TableExist]
        @TABLE_CATALOG nvarchar(256),
        @TABLE_SCHEMA nvarchar(256),
        @TABLE_NAME nvarchar(256)
        AS
    BEGIN
        IF NOT EXISTS(SELECT name FROM sys.databases WHERE name=@TABLE_CATALOG)
            RETURN 0
    
        declare @result table (TABLE_SCHEMA nvarchar(256), TABLE_NAME nvarchar(256))
        SET NOCOUNT ON
        insert into @result EXEC('Select TABLE_SCHEMA, TABLE_NAME from ' + @TABLE_CATALOG  + '.INFORMATION_SCHEMA.COLUMNS')
        SET NOCOUNT OFF
    
        IF EXISTS(SELECT TABLE_SCHEMA, TABLE_NAME FROM @result
                    WHERE TABLE_SCHEMA=@TABLE_SCHEMA AND TABLE_NAME=@TABLE_NAME)
            RETURN 1
    
        RETURN 0
    END
    
    GO
    
    0 讨论(0)
  • 2020-12-13 18:09
    select * from DB1.dbo.Table a inner join DB2.dbo.Table b on b.PrimKey = a.PrimKey 
    where a.FirstColumn <> b.FirstColumn ...
    

    Checksum that Matt recommended is probably a better approach to compare columns rather than comparing each column

    0 讨论(0)
  • 2020-12-13 18:19

    If both database on same server. You can check similar tables by using following query :

    select 
          fdb.name, sdb.name 
    from 
          FIRSTDBNAME.sys.tables fdb 
          join SECONDDBNAME.sys.tables sdb
          on fdb.name = sdb.name -- compare same name tables
    order by 
          1     
    

    By listing out similar table you can compare columns schema using sys.columns view.

    Hope this helps you.

    0 讨论(0)
提交回复
热议问题