该表上的主键是您的可取之处。显然,您将不同数据拉入的 SQL Server 数据库不会知道从一个表刷新到下一个表哪些记录已更改,但是如果您添加两个额外的表,并使用额外的列修改现有表,它应该能够通过利用HASHBYTES 来解决这个问题。
对于本例,我将新表命名为SentRows,但您可以在实践中使用更有意义的名称。我们将旧表中的新列称为HashValue。
将HashValue 列作为varbinary 数据类型添加到您的表中。 NOT NULL 也是。
创建您的 SentRows 表,其中包含主表主键中所有列的列,以及 HashValue 列。
创建一个结构与主表相同的RowsToSend 表,包括HashValue。
通过将HASHBYTES 应用于表中的所有非键列,修改您的查询以创建HashValue。 (这将非常乏味。对此感到抱歉。)
发送您的完整数据集。
现在将所有键值和HashValues 移动到SentRows 表中。截断主表。
在下一次拉取时,将SentRows 中的键值和HashValues 与主表中的新数据进行比较。
主键匹配 + 哈希匹配 = 未更改的行
主键匹配 + 哈希不匹配 = 更新行
传入数据中的主键但从现有数据集中缺失 = 新行
主键不在传入数据中,而是在现有数据集中 = 已删除行
提取您需要发送到RowsToSend 表的所有更改。
从RowsToSend发送更改。
将键值和HashValues 移动到您的SentRows 表中。更新已更改键值的散列,插入新行,并决定如何处理删除(如果必须处理删除)。
截断SentRows 表为明天做准备。
如果您愿意(如果您愿意,稍后会感谢您自己)将计算列添加到 SentRows 表,默认为 GETDATE(),它会告诉您添加行的时间。
你走了。从现在开始,只有增量。
编辑 2019-10-31:
一步一步(或 TL;DR):
1) 冲洗和填充MainTable。
2) 将 MainTable 上的键和散列与 SentRows 上的键和散列进行比较,以识别新的/更改的行。
3) 将新的/更改的行移至RowsToSend。
4) 发送RowsToSend 中的行。
5) 将所有行从RowsToSend 移动到SentRows。
6) 截断RowsToSend。