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

2022-01-11 17:20:58 字數 4353 閱讀 5316

不知不覺要寫2023年的最後一篇博文了~

一般來說,如何檢測兩張表的內容是否一致,體現在複製的時候發布端和訂閱端的兩端的資料上面

我這裡羅列了一些如何從資料庫層面來解決此類問題的方法

第一步當然就是檢查記錄數是否一致,否則不用想其他方法了~

這裡我們用兩張表t1_old,t1_new來演示

方法介紹

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

--

表結構:

create

table

t1_old (

id intnot

null

, log_time

datetime

default

'') ;

create

table

t1_new (

id intnot

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])

ast;

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  減法歸零

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

方法四:用全表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]表的資料複製到一張新的表以便進行比較

總結

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

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

一般來說,如何檢測兩張表的內容是否一致,體現在複製 的時候發布端和訂閱端的兩端的資料上面 我這裡羅列了一些如何從資料庫層面來解決此類問題的方法 第一步當然就是檢查記錄數 是否一致,否則不用想其他方法了 這裡我們用兩張表t1 old,t1 new 來演示方法介紹 方法一 老老實實看表結構和表記錄數,弊...

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

不知不覺要寫2014年的最後一篇博文了 一般來說,如何檢測兩張表的內容是否一致,體現在複製的時候發布端和訂閱端的兩端的資料上面 我這裡羅列了一些如何從資料庫層面來解決此類問題的方法 第一步當然就是檢查記錄數是否一致,否則不用想其他方法了 這裡我們用兩張表t1 old,t1 new來演示 方法介紹 方...

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

一般來說,如何檢測兩張表的內容是否一致,體現在複製的時候發布端和訂閱端的兩端的資料上面 我這裡羅列了一些如何從資料庫層面來解決此類問題的方法 第一步當然就是檢查記錄數是否一致,否則不用想其他方法了 這裡我們用兩張表t1 old,t1 new來演示 方法介紹 方法一 老老實實看表結構和表記錄數,弊端是...