次の方法で共有


sys.fn_cdc_map_time_to_lsn (Transact-SQL)

適用対象: SQL サーバー

指定した時刻のcdc.lsn_time_mapping システム テーブルのstart_lsn列からログ シーケンス番号 (LSN) の値を返します。 この関数を使用すると、変更データ キャプチャ列挙関数 cdc.fn_cdc_get_all_changes_<capture_instance> 必要な LSN ベースの範囲に datetime 範囲を体系的にマップし、その範囲内のデータ変更を返 cdc.fn_cdc_get_net_changes_<capture_instance> できます。

Transact-SQL 構文表記規則

構文

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>' { largest less than | largest less than or equal | smallest greater than | smallest greater than or equal }

tracking_time値と比較した場合に関係を満たす関連付けられたtran_end_timeを使用して、cdc.lsn_time_mapping テーブル内の個別の LSN 値を識別するために使用されます。

relational_operatornvarchar(30)です。

tracking_time

照合する datetime 値です。 tracking_timedatetime です。

返り値の種類

binary(10)

解説

sys.fn_cdc_map_time_to_lsn関数を使用して datetime 範囲を LSN 範囲にマップする方法を理解するには、次のシナリオを検討してください。

変更データを毎日抽出するとします。 つまり、特定の日の午前 0 時までに発生した変更を取得する必要があります。 時間範囲の下限は、前日の午前 0 時までですが、含まれません。 上限は、特定の日の午前 0 時までであり、その日の午前 0 時までです。 次の例では、関数 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 は、前日の午前 0 時以降に発生した変更を制限するために使用されます。 異なる LSN 値を持つ複数のエントリが、cdc.lsn_time_mapping テーブルの下限として識別されるtran_end_time値を共有する場合、関数は最小の LSN を返し、すべてのエントリが含まれていることを確認します。 上限の場合、関係演算子 largest less than or equal to を使用して、 tran_end_time 値として午前 0 時を持つエントリを含む、その日のすべてのエントリが範囲に含まれるようにします。 異なる LSN 値を持つ複数のエントリが、上限として識別された tran_end_time 値を共有する場合、関数は最大の LSN を返し、すべてのエントリが確実に含まれるようにします。

アクセス許可

ロール public のメンバーシップが必要です。

次の例では、sys.fn_cdc_map_time_to_lsn関数を使用して、tran_end_time値が午前 0 時以上の行が cdc.lsn_time_mapping テーブルに存在するかどうかを判断します。 このクエリを使用して、キャプチャ プロセスが前日の午前 0 時までコミットされた変更を既に処理しているかどうかを判断し、その日の変更データの抽出を続行できます。

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

関連項目