CD C Функция не отображает информацию за прошедший день - PullRequest
0 голосов
/ 18 февраля 2020

Я использую SQL Server 2014 (SP2).

Я включил CD C для таблицы. Затем я хочу просмотреть все, что произошло за последние 24 часа, поэтому я использую следующее:

DECLARE @begin_time DATETIME, @end_time DATETIME, @begin_lsn BINARY(10), @end_lsn BINARY(10); 
SELECT @begin_time = GETDATE()-1, @end_time = GETDATE(); 
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 [MyDatabase].cdc.fn_cdc_get_all_changes_dbo_MyTable(@begin_lsn,@end_lsn,'all') 
GO

Но я продолжаю получать следующее сообщение об ошибке:

An insufficient number of arguments were supplied for the procedure or function cdc.fn_cdc_get_all_changes_ ... .

Однако, вышеупомянутая функция генерируется системой, когда я включил CD C и содержит только 3 параметра:

ALTER function [cdc].[fn_cdc_get_all_changes_dbo_MyTable]
(   @from_lsn binary(10),
    @to_lsn binary(10),
    @row_filter_option nvarchar(30)
)

Почему функция не работает?

1 Ответ

1 голос
/ 18 февраля 2020

Если указанный диапазон LSN не попадает во временную шкалу отслеживания изменений для экземпляра захвата, функция возвращает ошибку 208 («Недостаточное количество аргументов было предоставлено для процедуры или функции cd c .fn_cdc_get_all_changes. ").

В соответствии с этим объяснением может потребоваться определить @begin_time и @end_time, например, вы можете указать время начала и время окончания в соответствии с __ $ start_lsn компакт-диска C Таблица. Если вы выполните следующий запрос, вы не увидите ошибку.

DECLARE @begin_time DATETIME, @end_time DATETIME, @begin_lsn BINARY(10), @end_lsn BINARY(10); 
--SELECT @begin_time = GETDATE()-1, @end_time = GETDATE(); 
SELECT @begin_time=sys.fn_cdc_map_lsn_to_time(MIN(__$start_lsn))  FROM AdventureWorks2017.cdc.dbo_MyTable_CT
SELECT @end_time = sys.fn_cdc_map_lsn_to_time(MAX(__$start_lsn)) FROM AdventureWorks2017.cdc.dbo_MyTable_CT
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 AdventureWorks2017.cdc.fn_cdc_get_all_changes_dbo_MyTable(@begin_lsn, @end_lsn, N'all') 

+------------------------+------------------------+--------------+----------------+----+----------+------------+-------------------------+
|      __$start_lsn      |       __$seqval        | __$operation | __$update_mask | Id | SomeText | ModifiedBy |      ModifiedDate       |
+------------------------+------------------------+--------------+----------------+----+----------+------------+-------------------------+
| 0x0000002E000070F80004 | 0x0000002E000070F80003 |            2 | 0x0F           |  2 | SomeText | Matt       | 2020-02-18 14:38:00.120 |
+------------------------+------------------------+--------------+----------------+----+----------+------------+-------------------------+
...