sys.fn_cdc_map_time_to_lsn (Transact-SQL)

适用于:SQL Server

返回指定时间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>” { 最大小于 | 最大小于或等于 | 最小大于 | 最小大于或等于 }

用于在表中标识一个不同的 LSN 值 cdc.lsn_time_mapping ,与 tran_end_timetracking_time 值相比,该值与满足关系的相关值。

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

另请参阅