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 架構範圍,以便傳回該範圍內的資料變更。

主題連結圖示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 }
    這可用來識別與 tran_end_time 相關之 cdc.lsn_time_mapping 資料表中的不同 LSN 值,該值滿足與 tracking_time 值相比較時的關聯性。

    relational_operator 是 nvarchar(30)。

  • tracking_time
    這是要比對的日期時間值。tracking_time 是 datetime。

傳回類型

binary(10)

備註

若要瞭解 sys.fn_cdc_map_time_lsn 如何用來將日期時間範圍對應至 LSN 範圍,請考慮下列狀況。假設某位取用者想要每天擷取變更資料。也就是說,該取用者只需要指定當天的變更 (直到且包括午夜)。此時間範圍的下限應該是直到但不包括前一天的午夜。其上限應該是直到且包括指定當天的午夜。下列範例會說明 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' 是用來限制前一天午夜之後所發生的變更。如果含有不同 LSN 值的多個項目共用 cdc.lsn_time_mapping 資料表中識別為下限的 tran_end_time 值,此函數就會傳回最小的 LSN (確保所有項目都包括在內)。若為上限,則關係運算子 ‘largest less than or equal to’ 就會用來確保此範圍包括當天的所有項目,包括以午夜做為其 tran_end_time 值的項目。如果含有不同 LSN 值的多個項目共用識別為上限的 tran_end_time 值,此函數就會傳回最大的 LSN (確保所有項目都包括在內)。

權限

需要 public 角色中的成員資格。

範例

下列範例會使用 sys.fn_cdc_map_time_lsn 函數來判斷 cdc.lsn_time_mapping 資料表中是否有任何 tran_end_time 值大於或等於午夜的資料列。例如,這個查詢可用來判斷擷取處理序是否已經處理了直到前一天午夜所認可的變更,如此當天的變更資料擷取才能繼續進行。

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