如何从CDC表中分部分读取数据?

问题描述 投票:0回答:1

我有 2 张带 CDC 的大桌子。 这个想法是将数据传输到一些新表。所以,我想从CDC表中分部分读取数据,并且不要重复读取已经读取的内容。

如何做到?

sql-server cdc
1个回答
0
投票

当您为 CDC 启用表时,SQL Server 为表创建的

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
参数的数据。

所以,假设你的算法如下所示:

  1. 读取我们上次从持久存储中获得的最大LSN,并将该值写入
    @variable
  2. 边界检查
    @variable
    (根据验证边界文档)
  3. 调用更改函数,使用
    @variable
    作为
    from_lsn
    参数值。
  4. 从结果集中获取最大的
    __$start_lsn
    并将其保存回持久存储。

如果这样做,您将获得一些与上次相同的行 - 即 LSN 等于

@variable
中的值的任何行。

因此你应该做的是:

  1. 读取我们上次从持久存储中获得的最大LSN,并将该值写入
    @variable
  2. 使用 fn_cdc_increment_lsn 来递增
    @variable
  3. 边界检查
    @variable
    (根据验证边界文档)
  4. 调用更改函数,使用
    @variable
    作为
    from_lsn
    参数值。
  5. 从结果集中获取最大的
    __$start_lsn
    并将其保存回持久存储。
© www.soinside.com 2019 - 2024. All rights reserved.