sys.fn_cdc_map_time_to_lsn (Transact-SQL)

适用于SQL Server

返回指定时间cdc.lsn_time_mapping系统表中列的日志序列号 (LSN) 值start_lsn。 可以使用此函数系统地将日期时间范围映射到变更数据捕获枚举函数 cdc.fn_cdc_get_all_changes_<capture_instance>cdc.fn_cdc_get_net_changes_<所需的基于 LSN 的范围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>” { 最大小于 | 小于或等于 | 小于或等于 | 小于 | 小于或等于 }

用于在表中标识与tracking_time值进行比较时满足关系的关联tran_end_time值中的cdc.lsn_time_mapping不同 LSN 值。

relational_operatornvarchar(30)。

tracking_time

要进行匹配的日期时间值。 tracking_timedatetime

返回类型

binary(10)

注解

若要了解如何sys.fn_cdc_map_time_to_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 值的多个条目共享tran_end_timecdc.lsn_time_mapping表中标识为下限的值,该函数将返回最小的 LSN 以确保包含所有条目。 对于上限,关系运算符 largest less than or equal to 用于确保范围包括当天的所有条目,包括那些将午夜作为值 tran_end_time 。 如果具有不同 LSN 值的多个条目共享 tran_end_time 标识为上限的值,该函数将返回最大的 LSN,确保包含所有条目。

权限

要求 公共 角色具有成员身份。

示例

以下示例使用sys.fn_cdc_map_time_to_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

另请参阅