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