;
1.fn_cdc_get_all_changes_capture_instance
针对在指定日志序列号 (LSN) 范围内应用到源表的每项更改均返回一行
USE AdventureWorks2008R2;
DECLARE @from_lsn binary(10), @to_lsn binary(10)
SET @from_lsn =
sys.fn_cdc_get_min_lsn('HR_Department')
SET @to_lsn = sys.fn_cdc_get_max_lsn()
SELECT * FROM cdc.fn_cdc_get_all_changes_HR_Department
(@from_lsn, @to_lsn, N'all');
2.fn_cdc_get_net_changes_capture_instance
针对指定 LSN 范围内每个已更改的源行返回一个净更改行。也就是说,如果在 LSN 范围内源行具有多项更改,
则该函数将返回反映该行最终内容的单一行。例如,如果事务在源表中插入一行,并且 LSN 范围内的后续事务更新了该行中的一个或多个列,
则该函数将只返回一行,其中包含多个更新的列值。
如果值最后是删除操作,则不返回该LSN的值
USE AdventureWorks2008R2;
DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);
-- Obtain the beginning of the time interval.
SET @begin_time = GETDATE() -1;
-- DML statements to produce changes in the HumanResources.Department table.
INSERT INTO HumanResources.Department (Name, GroupName)
VALUES (N'MyDept', N'MyNewGroup');
UPDATE HumanResources.Department
SET GroupName = N'Resource Control'
WHERE GroupName = N'Inventory Management';
DELETE FROM HumanResources.Department
WHERE Name = N'MyDept';
-- Obtain the end of the time interval.
SET @end_time = GETDATE();
-- Map the time interval to a change data capture query range.
SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
-- Return the net changes occurring within the query window.
SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');
3.sys.fn_cdc_decrement_lsn
根据指定的 LSN 返回序列中的上一个日志序列号 (LSN)
Use AdventureWorks2008R2;
SELECT sys.fn_cdc_decrement_lsn(sys.fn_cdc_get_max_lsn())
下例在一个返回 LSN 值小于最大 LSN 值的更改数据行的查询中,使用 sys.fn_cdc_decrement_lsn 来设置 LSN 上限。
Use AdventureWorks2008R2;
DECLARE @from_lsn binary(10), @to_lsn binary(10);
SET @from_lsn = sys.fn_cdc_get_min_lsn('HR_Department');
SET @to_lsn = sys.fn_cdc_decrement_lsn(sys.fn_cdc_get_max_lsn());
SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department( @from_lsn, @to_lsn, 'all');
4.sys.fn_cdc_increment_lsn
根据指定的 LSN 返回序列中的下一个日志序列号 (LSN)。
此函数返回的 LSN 值始终大于指定的值,并且不存在介于这两个值之间的 LSN 值。
若要系统地查询随时间变化的更改数据流,可以定期重复调用该查询函数,每次调用时指定一个新的查询间隔来限定查询中返回的更改的范围。为帮助确保不丢失数据,通常使用前一个查询的上限来生成后一个查询的下限。由于查询间隔是一个闭区间,因此新的下限必须大于前一个上限,但要足够小,以确保不存在 LSN 值介于此值与旧上限之间的更改。sys.fn_cdc_increment_lsn 函数就是用来获取此值的。
Use AdventureWorks2008R2;
SELECT sys.fn_cdc_increment_lsn(sys.fn_cdc_get_max_lsn())
5.sys.fn_cdc_get_column_ordinal
返回实例制定列的列序号。
Use AdventureWorks2008R2;
SELECT sys.fn_cdc_get_column_ordinal ( 'HR_Department','NAME');
6.sys.fn_cdc_get_max_lsn
返回 cdc.lsn_time_mapping 系统表的 start_lsn 列中的最大日志序列号 (LSN)。您可以使用此函数为任何捕获实例返回变更数据捕获时间线的高端点
USE AdventureWorks2008R2;
SELECT sys.fn_cdc_get_max_lsn()AS max_lsn;
SELECT sys.fn_cdc_get_min_lsn(N'HR_Department');
USE AdventureWorks2008R2;
DECLARE @from_lsn binary(10), @to_lsn binary(10);
SET @from_lsn = sys.fn_cdc_get_min_lsn(N'HR_Department');
SET @to_lsn = sys.fn_cdc_get_max_lsn();
SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');
7.sys.fn_cdc_get_min_lsn
USE AdventureWorks2008R2;
SELECT sys.fn_cdc_get_min_lsn ('HR_Department')AS min_lsn;---查询制定的实例名的最小LSN
8.sys.fn_cdc_has_column_changed ( 'capture_instance','column_name' , update_mask )
标识指定的更新掩码是否指示已更新关联的更改行中的指定列。
USE AdventureWorks2008R2;
SELECT sys.fn_cdc_has_column_changed ('HR_Department','name' , 2)
9.sys.fn_cdc_is_bit_set
指示捕获的列是否已更新,采用的方法是检查是否在提供的位掩码内设置了其序号位置。
USE AdventureWorks2008R2;
DECLARE @from_lsn binary(10), @to_lsn binary(10), @GroupNm_ordinal int;
SET @from_lsn = sys.fn_cdc_get_min_lsn('HR_Department');
SET @to_lsn = sys.fn_cdc_get_max_lsn();
SET @GroupNm_ordinal = sys.fn_cdc_get_column_ordinal('HR_Department','GroupName');
SELECT sys.fn_cdc_is_bit_set(@GroupNm_ordinal,__$update_mask) as 'IsGroupNmUpdated', *
FROM cdc.fn_cdc_get_all_changes_HR_Department( @from_lsn, @to_lsn, 'all')
WHERE __$operation = 4;
10.sys.fn_cdc_map_lsn_to_time
为指定的日志序列号 (LSN) 返回 cdc.lsn_time_mapping 系统表的 tran_end_time 列中的日期和时间值。
您可以使用此函数系统地将 LSN 范围映射到更改表中的日期范围
SELECT sys.fn_cdc_map_lsn_to_time(sys.fn_cdc_get_max_lsn());
11.sys.fn_cdc_map_time_lsn
下面的示例使用 sys.fn_cdc_map_time_lsn 函数来确定在 cdc.lsn_time_mapping 表中是否有 tran_end_time
值大于或等于指定时间的行。例如,可以用此查询来确定捕获进程是否已处理完截至前指定时间提交的更改
DECLARE @extraction_time datetime, @lsn binary(10);
SET @extraction_time = GETDATE();
SELECT @lsn = sys.fn_cdc_map_time_to_lsn ('smallest greater than or equal', @extraction_time);
IF @lsn IS NOT NULL
BEGIN
print '...'
DECLARE @begin_time datetime, @end_time datetime, @begin_lsn binary(10), @end_lsn binary(10);
SET @begin_time = '2015-04-07 18:00:00.000';
SET @end_time = '2015-04-08 18: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 ');