我有 2 张带 CDC 的大桌子。 这个想法是将数据传输到一些新表。所以,我想从CDC表中分部分读取数据,并且不要重复读取已经读取的内容。
如何做到?
fn_cdc_get_net_changes_*
函数(或者获取所有更改,如果这是您的要求)采用 from_LSN
和 to_LSN
参数。这是你的滑动窗口。该函数返回一个 __$start_lsn
列。使用它来跟踪您的最新情况,并在下次调用它时向前滑动窗口。
根据您的评论 - 是的,在从更改函数获得结果后,您应该存储收到的最大
__$start_lsn
值。这将成为您下次调用时的 from_lsn
参数...
...嗯,几乎。在调用这些更改函数时存在一些“陷阱”。它并不是非常复杂,但是在 StackOverflow 答案中提供的信息太多了。幸运的是,有关于这个主题的Microsoft 文档。请参阅验证 LSN 边界部分。
此外,请注意更改函数的 from 和 to 参数代表一个 close 区间。换句话说,该函数将返回大于或等于
from_lsn
值,且小于或等于to_lsn
参数的数据。
所以,假设你的算法如下所示:
@variable
。@variable
(根据验证边界文档)@variable
作为 from_lsn
参数值。__$start_lsn
并将其保存回持久存储。如果这样做,您将获得一些与上次相同的行 - 即 LSN 等于
@variable
中的值的任何行。
因此你应该做的是:
@variable
。@variable
。@variable
(根据验证边界文档)@variable
作为 from_lsn
参数值。__$start_lsn
并将其保存回持久存储。