簡體   English   中英

比較兩個差異的T-SQL表

[英]Comparing two T-SQL tables for diffs

我有兩個相同數據庫的實例。 第一個數據庫代表今天的數據,第二個數據來自6個月前。 我需要找到特定表中條目子集的差異。

對於具有兩個表中的ID的條目,我想找到一種方法來僅查看不相同的行。

有任何想法嗎?

謝謝

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'

請記住將schema放在表名中。

從您的文本中,我認為您說有一個ID可用於匹配行。

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

未經測試,但應該工作。

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

你可以在這里閱讀更多

對於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

OUTPUT

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
        ....

有點晚了,但是:

SELECT *
 from Table1
except select *
 from Table2

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

SELECT *
 from Table2
except select *
 from Table1

將在表2中顯示不在Table1中的所有內容,以及

SELECT *
 from Table1
intersect select *
 from Table2

將顯示兩個表中相同的所有行。 如果已知任何列在表之間有所不同,請僅指定需要比較的列。

正如您所知,有一個非常好的第三方工具可以為SQL Server數據庫執行此類操作,稱為SQL數據比較。 它由紅門出售。 http://www.red-gate.com/products/SQL_Data_Compare/index.htm?gclid=CKPp-6-Bi50CFQRM5QodtWGl8g

有一個免費試用版。 但值得花錢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM