sys.fn_cdc_map_time_to_lsn (Transact-SQL)
指定した期間にわたって、cdc.lsn_time_mapping システム テーブルの start_lsn 列からログ シーケンス番号 (LSN) 値を返します。この関数を使用すると、変更データ キャプチャの列挙関数 (cdc.fn_cdc_get_all_changes_<capture_instance> および cdc.fn_cdc_get_net_changes_<capture_instance>) で範囲内のデータ変更を返すために必要となる日付時刻範囲を LSN ベースの範囲に体系的にマップできます。
構文
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 }
cdc.lsn_time_mapping テーブル内の個別の LSN 値と、それに関連付けられ、tracking_time 値と比較したときに関係を満たす tran_end_time とを識別するために使用します。relational_operator のデータ型は nvarchar(30) です。
tracking_time
照合する日付時刻値を指定します。tracking_time のデータ型は datetime です。
戻り値の型
binary(10)
説明
sys.fn_cdc_map_time_lsn を使用して日付時刻範囲を LSN 範囲にマップする方法を理解するために、次のシナリオを考えてみましょう。変更データを毎日抽出するとします。つまり、特定の日の午前 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 が返されます。上限については、午前 0 時を tran_end_time 値として持つ日のすべてのエントリが範囲に含まれるように、関係演算子 'largest less than or equal to' を使用します。LSN 値が異なる複数のエントリが上限として識別された tran_end_time 値を共有する場合、すべてのエントリが含まれる最大の LSN が返されます。
権限
public ロールのメンバーシップが必要です。
例
次の例では、sys.fn_cdc_map_time_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