Freigeben über


sys.fn_cdc_map_time_to_lsn (Transact-SQL)

Gilt für: SQL Server

Gibt den Wert der Protokollsequenznummer (Log Sequence Number, LSN) aus der start_lsn Spalte in der cdc.lsn_time_mapping Systemtabelle für die angegebene Zeit zurück. Mit dieser Funktion können Sie Datum/Uhrzeitbereiche systematisch dem LSN-basierten Bereich zuordnen, der von den Änderungsdatenerfassungs-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.

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>' { größten kleiner als | größten kleiner als oder gleich | kleinster größer als | kleinster größer als | kleiner als oder gleich }

Wird verwendet, um einen eindeutigen LSN-Wert in der cdc.lsn_time_mapping Tabelle mit einem zugeordneten tran_end_time Wert zu identifizieren, der die Beziehung im Vergleich zum tracking_time Wert erfüllt.

relational_operator ist nvarchar(30)

tracking_time

Der datetime-Wert, mit dem verglichen werden soll. tracking_time ist datetime

Rückgabetyp

binary(10)

Hinweise

Um zu verstehen, wie die sys.fn_cdc_map_time_to_lsn Funktion zum Zuordnen von Datums-/Uhrzeitbereichen zu LSN-Bereichen verwendet werden kann, sollten Sie das folgende Szenario berücksichtigen.

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. Das folgende Beispiel zeigt, wie die Funktion sys.fn_cdc_map_time_to_lsn verwendet werden kann, um diesen zeitbasierten Bereich systematisch dem LSN-basierten Bereich zuzuordnen, der von den Änderungsdatenerfassungs-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 Operator smallest greater than wird verwendet, um Änderungen auf diejenigen einzuschränken, die nach Mitternacht am vorherigen Tag aufgetreten sind. Wenn mehrere Einträge mit unterschiedlichen LSN-Werten den tran_end_time in der cdc.lsn_time_mapping Tabelle als untere Grenze identifizierten Wert gemeinsam nutzen, gibt die Funktion den kleinsten LSN zurück, um sicherzustellen, dass alle Einträge enthalten sind. Für die obere Grenze wird der relationale Operator largest less than or equal to verwendet, um sicherzustellen, dass der Bereich alle Einträge für den Tag enthält, einschließlich derjenigen, die Mitternacht als tran_end_time Wert aufweisen. Wenn mehrere Einträge mit unterschiedlichen LSN-Werten den tran_end_time als obere Grenze identifizierten Wert gemeinsam verwenden, gibt die Funktion den größten LSN zurück, 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_to_lsn Funktion verwendet, um zu bestimmen, ob in der cdc.lsn_time_mapping Tabelle Zeilen mit einem tran_end_time Wert vorhanden sind, 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

Siehe auch