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,> 以返回该范围内的数据更改。
语法
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_operator为 nvarchar(30)。
tracking_time
要进行匹配的日期时间值。 tracking_time 为 datetime。
返回类型
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_time
cdc.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