如何使用Sql Server 2008比较不同数据库中两个表之间的数据?

Jag*_*ahu 42 sql sql-server sql-server-2008

我在Sql server 2008中有两个数据库,名为DB1和DB2.这两个数据库也有相同的表和相同的表数据.但是,我想检查这些表中的数据是否有任何差异.

有人可以帮我一个脚本吗?

Mik*_*son 29

select * 
from (
      select *
      from DB1.dbo.Table
      except
      select *
      from DB2.dbo.Table
     ) as T
union all
select * 
from (
      select *
      from DB2.dbo.Table
      except
      select *
      from DB1.dbo.Table
     ) as T
Run Code Online (Sandbox Code Playgroud)

测试代码:

declare @T1 table (ID int)
declare @T2 table (ID int)

insert into @T1 values(1),(2)
insert into @T2 values(2),(3)

select * 
from (
      select *
      from @T1
      except
      select *
      from @T2
     ) as T
union all
select * 
from (
      select *
      from @T2
      except
      select *
      from @T1
     ) as T
Run Code Online (Sandbox Code Playgroud)

结果:

ID
-----------
1
3
Run Code Online (Sandbox Code Playgroud)

  • @JagadisSahu"EXCEPT返回左查询中的任何不同值,这些值在右侧查询中也找不到." http://msdn.microsoft.com/en-us/library/ms188055.aspx (2认同)
  • @JagadisSahu"UNION指定组合多个结果集并作为单个结果集返回." http://msdn.microsoft.com/en-us/library/ms180026.aspx (2认同)

小智 24

我真的建议遇到这个问题的人去找第三方数据库比较工具.

原因 - 这些工具可以节省大量时间并使流程不易出错.

我使用过ApexSQL(Diff和Data Diff)的比较工具,但你不能错过marc_s和Marina Nastenko已经指出的其他工具.

如果你完全确定你只是要比较一次表,那么SQL就可以了,但是如果你不时需要它,那么你最好使用第三方工具.

如果您没有预算购买它,那么只需在试用模式下使用它即可完成工作.

我希望新读者会觉得这很有用,即使这是一个迟到的答案......


Mat*_*att 7

我使用Checksum(*)函数完成了这样的事情

在essance中,它为所有列数据创建行级校验和,然后您可以将每个表的每行的校验和相互比较,使用左连接,以查找不同的行.

希望有意义......

更好的例子....

select *
from 
( select checksum(*) as chk, userid as k from UserAccounts) as t1
left join 
( select checksum(*) as chk, userid as k from UserAccounts) as t2 on t1.k = t2.k
where t1.chk <> t2.chk 
Run Code Online (Sandbox Code Playgroud)