0

我在 2 个数据库中有 2 个表。表的方案是相同的。没有时间戳或最后更新的信息。表 A 是一个实时表,即在“the”程序中更新。更新记录、插入记录和删除记​​录都发生在表 A 中。表 B 是每周进行的备份。有没有一种快速的方法来比较这两个表并给我类似的结果:

I | 54
D | 55
U | 60

所以 live 表中的记录 54 是新的,live 表中的记录 55 被删除,live 表中的记录 60 被更新。

这需要在 SQL Server 2008 及更高版本中工作。

字段:id、first_name、last_name、电话、电子邮件、address_id、birth_date、last_visit、provider_id、评论

我无法控制这个计划。我对表 A 具有只读访问权限,对表 B 具有读写权限。

存储每个表 A 的行的哈希而不是表的完整副本会更容易吗?一般来说,我需要知道哪些行在没有内置时间戳的情况下被更新/插入和删除。我有每周备份表要查看,但如果需要,我可以创建一个哈希表。

4

3 回答 3

1

使用两个完全连接,第一个用于检查 id 是否存在并识别插入和删除,第二个用于行相等。

在示例中,为了简单起见,我使用了校验和,但我建议您阅读使用它的缺点,并考虑使用哈希字节等替代方法或检查每一列是否相等

Select id, checksum(*) hash
Into #live
From live.dbo.tbl

Select id, checksum(*) hash
Into #archive
From archive.dbo.tbl

Select l1.id,
    Case when l1.id is null then 'd'
              when a1.id is null then 'I'
              when a2.id is null then 'u' end change_type
From #live l1
Full Join #archive a1 On a1.id = l1.id
Full Join #archive a2 On a2.id = l1.id
                                    And  a2.hash = l1.hash
于 2013-11-06T23:27:59.417 回答
0

我将推荐一个工具,但它不是免费的,尽管它有一个功能齐全的 30 天试用期。如果您要比较 SQL Server 表中的数据,请查看 Red Gate 的 SQL 数据比较。它并不便宜,而且它会为自己付出很多倍的代价。(如果您需要比较模式,他们的 SQL Compare 会这样做。)

除非有第三个表,您可以在其中编写一个比较查询并选择一个表中的那些而不是另一个(用一个字段指示),另一个表中的那些而不是第一个表中的那些,然后逐个字段比较以查找那些不同的——那也应该起作用。这将花费更长的时间,但如果只是一张桌子,编写该代码所需的时间应该少于您为 Red Gate 工具支付的时间。

于 2013-11-06T22:49:36.080 回答
0

如果有一列或一组列可以唯一标识每一行,则可以编写一系列 sql 语句来标识插入、更新和删除。如果没有唯一的行标识符或唯一标识符(例如,使其唯一的列之一)发生更改,则不会。

于 2013-11-06T22:50:57.350 回答