2011-03-29 63 views
0

增量变化我怎样才能从SQL Server CDC例如增量变化:如何获得从SQL Server CDC

我有数据库和任何插入,更新表的客户或删除将被保存在CDC表顾客。

我想要一张表格告诉我接下来应该做些什么改变。

例如,每10分钟我只会读取最近10分钟的更改并保存此时间范围,因此下次我将最后一次加10分钟。 (增量读)

任何一个与CDC

任何很好的例子,由于

回答

2

您需要保存您在数据库中的某个地方处理的最后一个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 ;