sys.fn_cdc_map_time_to_lsn (Transact-SQL)

为指定的时间返回 cdc.lsn_time_mapping 系统表中 start_lsn 列中的日志序列号 (LSN) 值。可以使用此函数系统地将日期时间范围映射到基于 LSN 的范围,以供变更数据捕获枚举函数 cdc.fn_cdc_get_all_changes_<capture_instance>cdc.fn_cdc_get_net_changes_<capture_instance> 返回此范围内的数据更改。

主题链接图标Transact-SQL 语法约定

语法

sys.fn_cdc_map_time_to_lsn ('<relational_operator>', tracking_time )

<relational_operator> ::=
{  largest less than
 | largest less than or equal
 | smallest greater than
 | smallest greater than or equal
}

参数

  • '<relational_operator>' { largest less than | largest less than or equal | smallest greater than | smallest greater than or equal }
    用于标识这样的非重复 LSN 值:该值在 cdc.lsn_time_mapping 表中,且其关联的 tran_end_time 在与 tracking_time 值比较时满足关系。

    relational_operator 的数据类型为 nvarchar(30)。

  • tracking_time
    是要进行匹配的日期时间值。tracking_time 的数据类型为 datetime。

返回类型

binary(10)

注释

若要了解如何使用 sys.fn_cdc_map_time_lsn 将日期时间范围映射到 LSN 范围,请考虑以下情况。假定使用者希望每日提取更改数据。也就是说,使用者只需要给定日午夜之前(包括午夜)的更改。此时间范围的下限应为无限接近前一天午夜的时间点(但不包括前一天午夜)。上限应为给定日的午夜(包括午夜)。下例说明了如何使用 sys.fn_cdc_map_time_to_lsn 函数系统地将此基于时间的范围映射到基于 LSN 的范围,以供变更数据捕获枚举函数返回此范围内的所有更改之用。

DECLARE @begin\_time datetime, @end\_time datetime, @begin\_lsn binary(10), @end\_lsn binary(10);

SET @begin\_time = '2007-01-01 12:00:00.000';

SET @end\_time = '2007-01-02 12:00:00.000';

SELECT @begin\_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than', @begin\_time);

SELECT @end\_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end\_time);

SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@begin_lsn, @end\_lsn, 'all');

关系运算符 'smallest greater than' 用于将更改限制为在前一天的午夜后发生的更改。如果具有不同 LSN 值的多个项共用在 cdc.lsn_time_mapping 表中标识为下限的 tran_end_time 值,则该函数将返回最小的 LSN,以确保所有项均包含在内。对于上限,关系运算符 ‘largest less than or equal to’ 用于确保该范围包含此日的所有项(包括其 tran_end_time 值为午夜的那些项)。如果具有不同 LSN 值的多个项共用标识为上限的 tran_end_time 值,则此函数将返回最大的 LSN,以确保所有项均包括在内。

权限

要求具有 public 角色成员身份。

示例

下面的示例使用 sys.fn_cdc_map_time_lsn 函数来确定在 cdc.lsn_time_mapping 表中是否有 tran_end_time 值大于或等于午夜的行。例如,可以用此查询来确定捕获进程是否已处理完截至前一天午夜提交的更改,以便接下来可以提取当天的更改数据。

DECLARE @extraction_time datetime, @lsn binary(10);
SET @extraction_time = '2007-01-01 12:00:00.000';
SELECT @lsn = sys.fn_cdc_map_time_to_lsn ('smallest greater than or equal', @extraction_time);
IF @lsn IS NOT NULL
BEGIN
<some action>
END