sys.fn_cdc_map_time_to_lsn (Transact-SQL)
Retourne la valeur du numéro séquentiel dans le journal (LSN) de la colonne start_lsn dans la table système cdc.lsn_time_mapping pour l'heure spécifiée. Vous pouvez utiliser cette fonction pour mapper systématiquement des plages de datetime dans la plage basée sur LSN nécessaires aux fonctions d'énumération de capture de données modifiées cdc.fn_cdc_get_all_changes_<instance_capture> et cdc.fn_cdc_get_net_changes_<instance_capture> pour retourner des modifications de données dans cette plage.
Syntaxe
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
}
Arguments
'<relational_operator>' { largest less than | largest less than or equal | smallest greater than | smallest greater than or equal }
Permet d'identifier une valeur LSN distincte dans la table cdc.lsn_time_mapping avec un tran_end_time associé qui satisfait la relation en cas de comparaison à la valeur tracking_time.L'argument relational_operator est de type nvarchar(30).
tracking_time
Valeur datetime à mettre en correspondance. tracking_time est de type datetime.
Type de retour
binary(10)
Notes
Pour comprendre l'utilisation de sys.fn_cdc_map_time_lsn pour mapper les plages datetime aux plages de numéros séquentiels dans le journal, considérez le scénario suivant. Supposez qu'un utilisateur souhaite extraire des données de modifications de façon quotidienne. Autrement dit, il ne souhaite extraire que les modifications pour un jour donné jusqu'à minuit compris. La limite inférieure de la plage temporelle se situerait à minuit, sans l'inclure, le jour précédent. La limite supérieure se situerait à minuit (compris) le jour donné. L'exemple suivant montre comment la fonction sys.fn_cdc_map_time_to_lsn peut être utilisée pour mapper systématiquement cette plage temporelle à la plage basée sur le numéro séquentiel dans le journal requise par les fonctions d'énumération de capture des données modifiées pour retourner toutes les modifications dans cette plage.
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'opérateur relationnel 'smallest greater than' est utilisé pour limiter les modifications à celles qui ont été effectuées après minuit le jour précédent. Si plusieurs entrées avec différentes valeurs LSN partagent la valeur tran_end_time identifiée comme limite inférieure dans la table cdc.lsn_time_mapping, la fonction retournera le plus petit numéro séquentiel dans le journal qui garantit que toutes les entrées sont incluses. Pour la limite supérieure, l'opérateur relationnel 'largest less than or equal to' est utilisé pour garantir que la plage comprend toutes les entrées pour le jour qui inclut celles qui ont minuit comme valeur tran_end_time. Si plusieurs entrées avec différentes valeurs LSN partagent la valeur tran_end_time identifiée comme limite supérieure, la fonction retournera le plus grand numéro séquentiel dans le journal qui garantit que toutes les entrées sont incluses.
Autorisations
Nécessite l'appartenance au rôle public.
Exemples
L'exemple suivant utilise la fonction sys.fn_cdc_map_time_lsn pour déterminer si des lignes figurent dans la table cdc.lsn_time_mapping avec une valeur tran_end_time supérieure ou égale à minuit. Cette requête peut être utilisée pour déterminer, par exemple, si le processus de capture a déjà traité les modifications validées jusqu'à minuit le jour précédent, afin que l'extraction des données de modifications pour ce jour puisse continuer.
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