1

データベースの 1 つで CDC 機能を有効にしました。今、私はcdcテーブルに以下のテーブルデータを持っています

MemberID            LastName      __$operation
1                   David         4   
1                   Dave          4
2                   Jimmy         4
2                   Test          4

今私の問題は、cdc テーブルにクエリを実行し、すべてのメンバーの最新の行 (最新の更新値) をすべて取得する必要があることです。たとえば、クエリは次を返します

MemberID            LastName      __$operation
1                   Dave          4
2                   Test          4
4

5 に答える 5

1

CDC の _$operations だけで判断できるわけではありません。正しく実行したい場合は、次の他の列フィールドを使用してください。

__$start_lsn
__$end_lsn
__$seqval
__$update_mask
于 2014-02-06T14:38:28.277 に答える
1

したがって、あなたが何を求めているかを100%理解しているとは言えませんが、テーブル内のすべてのメンバーの最新の値が必要な場合は、CDC テーブルを無視してテーブル自体にクエリを実行するだけです。ここにすべての最新の値があるからです。結局。

特定の期間内に変更されたすべてのメンバーの最新の値を確認する必要がある場合は、cdc.fn_cdc_get_net_changes_(capture_instance) 関数を使用する必要があります。詳細は次のとおりです。

cdc.fn_cdc_get_net_changes

これにより、キャプチャ期間の開始日と終了日を (LSN を実際の時間にマップできるようにする sys.fn_cdc_map_time_to_lsn 関数を介して) 指定でき、この期間内の正味の変化がテーブルに出力されます。

cdc.fn_cdc_get_net_changes_(capture_instance) の変更は、テーブル名に応じて生成されます。これが何であるかを指定していないので、dbo_members と呼びます。必要に応じて変更してください。上記の関数を使用して、最終日に変更されたすべてのメンバーの最新の値:

DECLARE @begin_time DATETIME ,
    @end_time DATETIME ,
    @begin_lsn BINARY(10) ,
    @end_lsn BINARY(10);
SELECT  @begin_time = GETDATE() - 1 ,
        @end_time = GETDATE(); 
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  [MemberID] ,
        [LastName]
FROM    cdc.fn_cdc_get_net_changes_dbo_members(@begin_lsn, @end_lsn, 'all') 
GO 
于 2014-02-06T15:31:54.627 に答える
0

stoleary に従って、データ テーブルで最新の値を確認し、CDC を完全に無視するだけで済みますが、from と to の値で何が変更されたかを調べる場合は、_$operation 値 3 (削除済み) と 3 (削除済み) を参照する必要があります。 __$start_lsn と組み合わせた 4 つの (挿入された) 値。挿入および削除された値は、トリガーを作成するときに使用するテーブルに対応しています。

それらの値を実際に評価する前兆としてどの列値が変化するかを確認するには、sys.fn_cdc_is_bit_set(captured_columns結果 = 1 の .column_ordinal, __$update_mask) 関数。

風変わりな CDC の世界へようこそ。それをマスターしようとするだけでも、膨大な量の深夜とカフェイン ヒットが必要です。

于 2015-09-08T20:07:09.493 に答える