比较两个T-SQL表的差异

srm*_*ark 6 sql t-sql sql-server

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

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

有任何想法吗?

谢谢

Luk*_*sik 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 ...
Run Code Online (Sandbox Code Playgroud)

要生成较长的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
Run Code Online (Sandbox Code Playgroud)

用法示例:

EXEC compareTables 'db1_name','dbo.table1','db2_name','dbo.table1'
Run Code Online (Sandbox Code Playgroud)

记住在表名中放入模式。


Phi*_*ley 6

有点晚了,但是:

SELECT *
 from Table1
except select *
 from Table2
Run Code Online (Sandbox Code Playgroud)

将列出 Table1 中不存在于 Table2 中的所有行,

SELECT *
 from Table2
except select *
 from Table1
Run Code Online (Sandbox Code Playgroud)

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

SELECT *
 from Table1
intersect select *
 from Table2
Run Code Online (Sandbox Code Playgroud)

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