sys.fn_cdc_map_time_to_lsn (Transact-SQL)

Gibt den Wert der Protokollfolgenummer (LSN) für die angegebene Zeit in der start_lsn-Spalte der cdc.lsn_time_mapping-Systemtabelle zurück. Sie können diese Funktion verwenden, um datetime-Bereiche systematisch dem LSN-basierten Bereich zuzuordnen, der von den Change Data Capture-Enumerationsfunktionen cdc.fn_cdc_get_all_changes_<capture_instance> und cdc.fn_cdc_get_net_changes_<capture_instance> benötigt wird, um Datenänderungen innerhalb dieses Bereichs zurückzugeben.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

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
}

Argumente

  • '<relational_operator>' { largest less than | largest less than or equal | smallest greater than | smallest greater than or equal }
    Wird verwendet, um einen eindeutigen LSN-Wert in der cdc.lsn_time_mapping-Tabelle mit zugeordnetem tran_end_time-Wert zu identifizieren, der der Beziehung entspricht, wenn er mit dem Wert tracking_time verglichen wird.

    relational_operator ist vom Datentyp nvarchar(30).

  • tracking_time
    Ist der datetime-Wert, mit dem verglichen werden soll. tracking_time ist vom Datentyp datetime.

Rückgabetyp

binary(10)

Hinweise

Das folgende Szenario veranschaulicht, wie sys.fn_cdc_map_time_lsn verwendet werden kann, um datetime-Bereiche LSN-Bereichen zuzuordnen. Angenommen, ein Consumer möchte täglich Änderungsdaten extrahieren. In diesem Fall interessiert sich der Consumer nur für die Änderungen an einem bestimmten Tag bis einschließlich Mitternacht. Die Untergrenze des Zeitbereichs wäre bis Mitternacht des vorangehenden Tags (nicht einschließlich Mitternacht). Die Obergrenze wäre bis einschließlich Mitternacht des bestimmten Tags. Im folgenden Beispiel wird gezeigt, wie Sie die Funktion sys.fn_cdc_map_time_to_lsn verwenden können, um diesen zeitbasierten Bereich dem LSN-basierten Bereich zuzuordnen, der von den Change Data Capture-Enumerationsfunktionen benötigt wird, um alle Änderungen innerhalb dieses Bereichs zurückzugeben.

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');

Der relationale 'smallest greater than'-Operator wird verwendet, um auf die Änderungen einzuschränken, die nach Mitternacht am vorangehenden Tag aufgetreten sind. Wenn mehrere Einträge mit unterschiedlichen LSN-Werten den Wert tran_end_time verwenden, der als untere Grenze in der cdc.lsn_time_mapping-Tabelle identifiziert ist, gibt die Funktion den kleinsten LSN-Wert zurück, um sicherzustellen, dass alle Einträge enthalten sind. Für die obere Grenze wird der relationale 'largest less than or equal to'-Operator verwendet, um sicherzustellen, dass der Bereich alle Einträge für den Tag enthält, einschließlich der Einträge, die Mitternacht als ihren tran_end_time-Wert haben. Wenn mehrere Einträge mit unterschiedlichen LSN-Werten den Wert tran_end_time verwenden, der als obere Grenze identifiziert ist, wird die Funktion den größten LSN-Wert zurückgeben, um sicherzustellen, dass alle Einträge enthalten sind.

Berechtigungen

Erfordert die Mitgliedschaft in der public-Rolle.

Beispiele

Im folgenden Beispiel wird die sys.fn_cdc_map_time_lsn-Funktion verwendet, um zu bestimmen, ob es in der cdc.lsn_time_mapping-Tabelle Zeilen mit einem tran_end_time-Wert gibt, der größer oder gleich Mitternacht ist. Mit dieser Abfrage kann beispielsweise bestimmt werden, ob der Aufzeichnungsprozess bereits die Änderungen verarbeitet hat, für die bis Mitternacht des vorangehenden Tags ein Commit ausgeführt wurde, sodass mit dem Extrahieren von Änderungsdaten für diesen Tag fortgefahren werden kann.

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