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> できます。
構文
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_operator は nvarchar(30)です。
tracking_time
照合する datetime 値です。 tracking_time は datetime です。
返り値の種類
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