SQLSERVER中如何快速比較兩張表的不一樣


SQLSERVER中如何快速比較兩張表的不一樣

不知不覺要寫2014年的最后一篇博文了~

 

一般來說,如何檢測兩張表的內容是否一致,體現在復制的時候發布端和訂閱端的兩端的數據上面

我這里羅列了一些如何從數據庫層面來解決此類問題的方法


第一步當然就是檢查記錄數是否一致,否則不用想其他方法了~
這里我們用兩張表t1_old,t1_new來演示


方法介紹

 

方法一:老老實實看表結構和表記錄數,弊端是根本看不到兩張表的數據是否一致,只是看到表結構和記錄數是否一致

--表結構:
 CREATE TABLE t1_old (
  id int NOT NULL,
  log_time DATETIME DEFAULT ''
) ;
CREATE TABLE t1_new ( id int NOT NULL, log_time DATETIME DEFAULT '' ) ; --兩表的記錄數都為100條。 select count(*) from t1_old; select count(*) from t1_new;

 

 

方法二:加法去重 union 運算符排除重復的,但是有bug,在某些情形下不能簡單表示結果集一致,相當於無效

由於Union 本身具備把上下兩條連接的記錄做唯一性排序,所以這樣檢測起來比較簡單

SELECT  COUNT(*)
FROM    ( SELECT    *
          FROM      [t1_old]
          UNION
          SELECT    *
          FROM      [t1_new]
        ) AS T;


INSERT INTO [dbo].[t1_new]
        ( [id],[log_time] )
VALUES(1,''),(3,''),(4,'')

INSERT INTO [dbo].[t1_old]
        ( [id],[log_time] )
VALUES(1,''),(2,''),(3,'')

SELECT * FROM [dbo].[t1_new]
SELECT * FROM [dbo].[t1_old]

SELECT  COUNT(*)
FROM    ( SELECT    *
          FROM      [t1_new]
          UNION
          SELECT    *
          FROM      [t1_old]
        ) AS T;

兩表數據

查詢出來的結果是4

 

 

方法三:EXCEPT  減法歸零

SELECT  COUNT(*)
FROM    ( SELECT    *
          FROM      [dbo].[t1_new]
          EXCEPT
          SELECT    *
          FROM      [dbo].[t1_old]
        ) AS T;

SELECT  COUNT(*)
FROM    ( SELECT    *
          FROM      [dbo].[t1_old]
          EXCEPT
          SELECT    *
          FROM      [dbo].[t1_new]
        ) AS T;

SELECT * FROM [dbo].[t1_new]

SELECT * FROM [dbo].[t1_old]

這里檢測出來結果不對,那么就直接給出不一致的結論

 

 

方法四:用全表INNER JOIN,這個也是最爛的做法,當然這里指的是在表記錄數超級多的情況下

DECLARE @t1_newcount BIGINT
DECLARE @count BIGINT


SELECT  @t1_newcount = COUNT(*)
FROM    t1_new;


SELECT  @count = COUNT(*)
FROM    [t1_old] AS a
        INNER JOIN [t1_new] AS b ON [b].[id] = [a].[id]
                                    AND [b].[log_time] = [a].[log_time] --如果表中還有其他字段的自行添加
PRINT @count
PRINT @t1_newcount
IF ( @count = @t1_newcount )
    BEGIN 
        SELECT  'equal'
    END 
ELSE
    BEGIN
        SELECT  'not equal'

    END 

 

 

方法五:借助SQLSERVER自帶的tablediff工具,當初微軟制作這個工具的目的就是用於比較復制中發布表和訂閱表的數據一致

identical是相等的意思

 

方法六:借助發布端的驗證訂閱功能,驗證訂閱端跟發布端的數據是否一致

 

 

方法七:用checksum校驗,比較兩張表里的內容的checksum值是否一致

但是這種方法也只局限於兩表結構一摸一樣

我把[t1_new]表的數據復制到一張新的表以便進行比較

SELECT * FROM [dbo].[t1_new]
SELECT * FROM [dbo].[t1_newreplica]



SELECT SUM(CHECKSUM(*)) AS checksumvalue FROM [dbo].[t1_old]
SELECT SUM(CHECKSUM(*)) AS checksumvalue FROM [dbo].[t1_new]
SELECT SUM(CHECKSUM(*)) AS checksumvalue FROM [dbo].[t1_newreplica]


總結

從上面幾種數據庫提供的方法來看,用EXCEPT減法來歸零相對來說比較可靠,其他的方法比較適合在特定的情形下來檢測

 

如有不對的地方,歡迎大家拍磚o(∩_∩)o 

本文版權歸作者所有,未經作者同意不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM