sys.fn_cdc_map_time_to_lsn (Transact-SQL)
Restituisce il valore del numero di sequenza del file di log (LSN) dalla colonna start_lsn nella tabella di sistema cdc.lsn_time_mapping per l'ora specificata. È possibile utilizzare questa funzione per eseguire sistematicamente il mapping di intervalli datetime nell'intervallo basato su LSN richiesto dalle funzioni di enumerazione di Change Data Capture cdc.fn_cdc_get_all_changes_<capture_instance> e cdc.fn_cdc_get_net_changes_<capture_instance> per restituire le modifiche dei dati all'interno dell'intervallo.
Sintassi
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
}
Argomenti
'<relational_operator>' { largest less than | largest less than or equal | smallest greater than | smallest greater than or equal }
Utilizzato per identificare un valore LSN distinto nella tabella cdc.lsn_time_mapping con un tran_end_time associato che soddisfa la relazione in caso di confronto con il valore tracking_time.relational_operator è nvarchar(30).
tracking_time
È il valore datetime da confrontare. tracking_time è datetime.
Tipo restituito
binary(10)
Osservazioni
Per capire in che modo sys.fn_cdc_map_time_lsn può essere utilizzato per eseguire il mapping di intervalli datetime con intervalli LSN, considerare lo scenario seguente. Si supponga che un utente desideri estrarre su base giornaliera i dati delle modifiche. Ovvero, l'utente desidera solo le modifiche relative a un giorno specifico fino alla mezzanotte (inclusa). Il limite inferiore dell'intervallo di tempo raggiunge, ma non include, la mezzanotte del giorno precedente. Il limite superiore raggiunge e include la mezzanotte del giorno specificato. L'esempio seguente mostra in che modo la funzione sys.fn_cdc_map_time_to_lsn può essere utilizzata per eseguire sistematicamente il mapping di questo intervallo basato sull'ora nell'intervallo basato su LSN richiesto dalle funzioni di enumerazione dell'acquisizione dei dati delle modifiche per restituire tutte le modifiche all'interno dell'intervallo.
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');
L'operatore relazionale 'smallest greater than' è utilizzato per limitare le modifiche a quelle che si sono verificate dopo la mezzanotte del giorno precedente. Se più voci con valori LSN diversi condividono il valore tran_end_time identificato come limite inferiore nella tabella cdc.lsn_time_mapping, la funzione restituirà il valore LSN più piccolo assicurando l'inclusione di tutte le voci. Per il limite superiore, l'operatore relazionale 'largest less than or equal to' è utilizzato per assicurare che l'intervallo includa tutte le voci per il giorno, comprese quelle con il valore tran_end_time impostato sulla mezzanotte. Se più voci con i valori LSN diversi condividono il valore tran_end_time identificato come limite superiore, la funzione restituirà il valore LSN più grande assicurando l'inclusione di tutte le voci.
Autorizzazioni
È richiesta l'appartenenza al ruolo public.
Esempi
Nell'esempio seguente viene utilizzata la funzione sys.fn_cdc_map_time_lsn per determinare se nella tabella cdc.lsn_time_mapping sono presenti righe con un valore tran_end_time maggiore o uguale a mezzanotte. Questa query può essere utilizzata per determinare, ad esempio, se il processo di acquisizione ha già elaborato le modifiche di cui è stato eseguito il commit fino alla mezzanotte del giorno precedente, in modo tale che possa procedere l'estrazione di dati delle modifiche per il giorno specifico.
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