Поделиться через


sys.fn_cdc_map_time_to_lsn (Transact-SQL)

Область применения: SQL Server

Возвращает значение последовательности журнала (LSN) из столбца start_lsn в системной таблице cdc.lsn_time_mapping за указанное время. Эту функцию можно использовать для систематической сопоставления диапазонов дат и времени в диапазоне на основе LSN, необходимого для функций перечисления измененных данных cdc.fn_cdc_get_all_changes_<capture_instance> и cdc.fn_cdc_get_net_changes_<capture_instance> для возврата изменений данных в этом диапазоне.

Соглашения о синтаксисе Transact-SQL

Синтаксис

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
    }

Аргументы

'<relational_operator>' { крупнейший меньше | самый большой меньше или равно | наименьший больше | наименьший больше или равно }

Используется для идентификации отдельного значения LSN в cdc.lsn_time_mapping таблице с связанной tran_end_time связью при сравнении с значением tracking_time .

relational_operator — nvarchar(30).

tracking_time

Значение типа datetime для сопоставления. tracking_time — datetime.

Возвращаемый тип

binary(10)

Замечания

Чтобы понять, как sys.fn_cdc_map_time_to_lsn функцию можно использовать для сопоставления диапазонов даты и времени с диапазонами LSN, рассмотрим следующий сценарий.

Предположим, что потребителю нужно получать изменения данных ежедневно. То есть потребителю нужны изменения только за определенные сутки. Нижней границей диапазона будет полночь предыдущего дня, не входя в диапазон. Верхней границей будет полночь заданного дня. В следующем примере показано, как функцию sys.fn_cdc_map_time_to_lsn можно использовать для систематического сопоставления этого диапазона на основе времени в диапазон на основе LSN, необходимый функциям перечисления измененных данных для возврата всех изменений в этом диапазоне.

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

Реляционный оператор smallest greater than используется для ограничения изменений тех, которые произошли после полуночи в предыдущий день. Если несколько записей с разными значениями LSN используют tran_end_time значение, указанное как нижняя граница в таблице cdc.lsn_time_mapping , функция вернет наименьшее значение LSN, гарантирующее включение всех записей. Для верхней границы реляционный оператор largest less than or equal to используется для обеспечения того, чтобы диапазон включает все записи в течение дня, включая те, которые имеют полночь в качестве значения tran_end_time . Если несколько записей с разными значениями LSN используют tran_end_time значение, указанное как верхняя граница, функция вернет наибольшее значение LSN, гарантирующее включение всех записей.

Разрешения

Необходимо быть членом роли public.

Примеры

В следующем примере функция используется sys.fn_cdc_map_time_to_lsn для определения наличия строк в таблице cdc.lsn_time_mapping со tran_end_time значением, превышающим или равным полуночи. Запрос может применяться, например, для определения того, обработал ли процесс отслеживания изменения, зафиксированные до полуночи предыдущего дня, чтобы продолжить извлечение данных изменений для этого дня.

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

См. также