比较两个差异的T-SQL表

时间:2009-09-24 17:25:04

标签: sql sql-server tsql

我有两个相同数据库的实例。第一个数据库代表今天的数据,第二个数据来自6个月前。我需要找到特定表中条目子集的差异。

对于两个表中都有id的条目,我想找到一种方法来只查看不相同的行。

有什么想法吗?

由于

6 个答案:

答案 0 :(得分:6)

SELECT t1.id
FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id
WHERE ISNULL(t1.field1,'') <> ISNULL(t2.field1,'')
      OR ISNULL(t1.field2,'') <> ISNULL(t2.field2,'')
      OR ...

要生成长WHERE部分,您可以使用此功能:

CREATE PROCEDURE compareTables
    @db1    NVARCHAR(100),
    @table1 NVARCHAR(100),
    @db2    NVARCHAR(100),
    @table2 NVARCHAR(100)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @where NVARCHAR(MAX)
    DECLARE @cmd NVARCHAR(MAX)

    SET @where = ''

    SELECT @where = @where + 'ISNULL(t1.' + name + ','''') <> ISNULL(t2.' + name + ','''') OR ' 
    FROM sys.columns WHERE object_id = OBJECT_ID(@table1)

    SET @where = SUBSTRING(@where,1,LEN(@where)-3)

    SET @cmd = 'SELECT t1.id FROM ' + @db1 + '.' + @table1 + ' t1 '
    SET @cmd = @cmd + 'INNER JOIN ' + @db2 + '.' + @table2 + ' t2 ON t1.id = t2.id '
    SET @cmd = @cmd + 'WHERE ' + @where

    EXEC sp_executesql @cmd
END
GO

使用示例:

EXEC compareTables 'db1_name','dbo.table1','db2_name','dbo.table1'

请记住将模式放在表名中。

答案 1 :(得分:3)

从您的文字中,我认为您说有一个ID可用于匹配行。

SELECT t1.*, t2.*
FROM table1 t1 JOIN table2 t2 ON t1.id=t2.id 
WHERE BINARY_CHECKSUM(t1.*) <> BINARY_CHECKSUM(t2.*)

未经测试,但应该有效。

答案 2 :(得分:2)

您可以使用SQL Server 2005及更高版本附带的TableDiff.exe实用程序。

你可以read more here

答案 3 :(得分:2)

对于SQL Server 2005及以上尝试类似的事情:

declare @CurrentTable table (pk int, valuedata varchar(5))
declare @oldtable table (pk int, valuedata varchar(5))

insert into @CurrentTable values (1,'aa')
insert into @CurrentTable values(2,'bb')
insert into @CurrentTable values(3,'cc')
insert into @CurrentTable values(4,'dd')
insert into @CurrentTable values(5,'ee')

insert into @oldtable values(1,'aa')
insert into @oldtable values(1,'bb')
insert into @oldtable values(3,'zz')
insert into @oldtable values(7,'aa')
insert into @oldtable values(8,'qq')

select pk,valuedata  from @CurrentTable
except
select pk,valuedata from @oldtable

输出

pk          valuedata
----------- ---------
2           bb
3           cc
4           dd
5           ee

(4 row(s) affected)

如果SQL Server 2000或更早版本尝试这样的事情:

SELECT
    c.*
    FROM YourTableCurrent             c
        LEFT OUTER JOIN YourTableOld  o ON c.id=o.id
    WHERE ISNULL(c.IntCol,-2147483648)!=ISNULL(o.IntCol,-2147483648)
        OR ISNULL(c.varcharCol,'||null||')!=ISNULL(o.varcharCol,'||null||')
        OR ISNULL(c.DatetimeCol,'01/01/1753')!=ISNULL(o.DatetimeCol,'01/01/1753')
        ....
UNION
SELECT
    o.*
    FROM YourTableOld                     o
        LEFT OUTER JOIN YourTableCurrent  c ON c.id=o.id
    WHERE c.id IS NULL
        ....

答案 4 :(得分:1)

有点晚了,但是:

SELECT *
 from Table1
except select *
 from Table2

将列出Table1中表2中不存在的所有行,

SELECT *
 from Table2
except select *
 from Table1

将在表2中显示不在Table1中的所有内容,并且

SELECT *
 from Table1
intersect select *
 from Table2

将显示两个表中相同的所有行。如果已知任何列在表之间有所不同,请仅指定需要比较的列。

答案 5 :(得分:0)

您知道,有一个非常好的第三方工具可以为SQL Server数据库执行此类操作,称为SQL数据比较。它由红门出售。 http://www.red-gate.com/products/SQL_Data_Compare/index.htm?gclid=CKPp-6-Bi50CFQRM5QodtWGl8g

有一个免费试用版。但值得花钱。