Вам необходимо сохранить последний номер LSN, который вы обработали в вашей базе данных, где-то.
CREATE TABLE cdc_consumer
(cdc_consumer_id SMALLINT NOT NULL CONSTRAINT PK_cdc_consumer PRIMARY KEY CLUSTERED
, [description] VARCHAR(200) NOT NULL
, capture_instance SYSNAME NOT NULL
, last_start_lsn BINARY(10) NULL
, last_seqval BINARY(10) NULL
, date_last_consumed DATETIME NULL
, CONSTRAINT UQ_cdc_consumer UNIQUE NONCLUSTERED ([description], capture_instance));
Обновите эту таблицу, когда вы закончили обработку пакета записей CDC.начальная и конечная точки используют это:
CREATE PROCEDURE cdc_consumer_start_batch
@cdcConsumerId SMALLINT
, @startLsn BINARY(10) OUTPUT
, @seqval BINARY(10) OUTPUT
, @endLsn BINARY(10) OUTPUT
AS
BEGIN
DECLARE @lastLsn BINARY(10) ;
DECLARE @captureInstance SYSNAME ;
SELECT @lastLsn = last_start_lsn,
@seqval = last_seqval,
@captureInstance = capture_instance
FROM cdc_consumer
WHERE cdc_consumer_id = @cdcConsumerId ;
IF (@captureInstance IS NULL)
BEGIN
DECLARE @errorText VARCHAR(50) ;
SET @errorText = 'Cannot find a cdc consumer with id: "' + CAST(@cdcConsumerId AS VARCHAR(10)) + '"';
RAISERROR(@errorText,16,1) ;
END
SET @startLsn = sys.fn_cdc_get_min_lsn(@captureInstance) ;
IF (@lastLsn > @startLsn)
SET @startLsn = @lastLsn;
SET @endLsn = sys.fn_cdc_get_max_lsn() ;
IF (@endLsn < @startLsn)
RETURN 1 ;
ELSE
RETURN 0 ;
END ;