Ошибка при выполнении SQL-запроса на сбор данных об изменениях

Я получаю эту ошибку «Для процедуры или функции cdc.fn_cdc_get_all_changes_ было предоставлено недостаточное количество аргументов» при попытке выполнить следующий запрос sql.

use SpatialDB
go
declare @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);
set @begin_time=GETDATE()-1;
set @end_time=GETDATE();
set @from_lsn=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
set @to_lsn=sys.fn_cdc_map_time_to_lsn('largest greater than or eqaul', @end_time);
select * from cdc.fn_cdc_get_net_changes_dbo_Points(@from_lsn, @to_lsn, N'all');
go

person U chaudrhy    schedule 26.06.2013    source источник


Ответы (4)


Поздно, но для будущих искателей. . .

Сообщение об ошибке несколько вводит в заблуждение. Параметры, которые вы передаете функции, должны быть «действительными», иначе вы получите это разочаровывающее сообщение об ошибке.

Вот цитата из статьи TechNet для SQL Server 2008 Использование данных об изменениях. Я рекомендую вам прочитать эту статью.

Мы рекомендуем проверять границы LSN, которые будут использоваться в запросе TVF, перед их использованием. Нулевые конечные точки или конечные точки, лежащие за пределами интервала действия для экземпляра отслеживания, приведут к тому, что TVF системы отслеживания измененных данных будет возвращена с ошибкой.

Например, следующая ошибка возвращается для запроса всех изменений, когда параметр, используемый для определения интервала запроса, недействителен или находится вне допустимого диапазона, или параметр фильтра строк недействителен.

Сообщение 313, уровень 16, состояние 3, строка 1

Для процедуры или функции указано недостаточное количество аргументов cdc.fn_cdc_get_all_changes_ ...

Соответствующая ошибка, возвращаемая для запроса чистых изменений, выглядит следующим образом:

Сообщение 313, уровень 16, состояние 3, строка 1

Для процедуры или функции указано недостаточное количество аргументов cdc.fn_cdc_get_net_changes_ ...

Когда я впервые начал использовать эти функции в SQL Server 2012, я передавал дикие параметры, которые находились далеко за пределами диапазона дат, захваченных CDC. Когда я их очистил, то есть начал использовать допустимые диапазоны дат, последовали хорошие результаты.

person Gerald    schedule 21.04.2014

Более поздно, но для будущих искателей. . .

Я получил это сообщение, и причина в том, что у меня поменялись местами начальный номер LSN и конечный номер LSN. Итак, я поменял их обратно, и все заработало.

Я закончил с кодом вроде:

SELECT DISTINCT sh.siteid1 AS 'Site Number' ,CASE cdc.__$operation WHEN 1 THEN 'D' WHEN 2 THEN 'I' WHEN 4 THEN 'U' END AS CDC_OPERATION FROM site_header sh(NOLOCK) INNER JOIN cdc.fn_cdc_get_net_changes_dbo_svt_svsiteheader(0x00004B04000019300002, 0x00004B0500003A220001, N'All') cdc ON cdc.site_id = sh.site_id LEFT JOIN site_location sl ON sh.id_site = sl.id_site AND sh.primary_id = sl.id_rec

person M Akin    schedule 18.06.2015

У меня была та же проблема, и Джеральд был прав — если я использую LSN в пределах диапазона данных, захваченных CDC, проблем нет.

Теперь я ограничиваю свои значения LSN с помощью sys.fn_cdc_get_min_lsn('my_captureinstance') и sys.fn_cdc_get_max_lsn(), например:

DECLARE @begin_time DATETIME, @end_time DATETIME, @begin_lsn BINARY(10), @end_lsn BINARY(10), @min_lsn BINARY(10), @max_lsn BINARY(10);

SET @begin_time = '2015-06-23 00:00:00.000';
SET @end_time   = '2015-06-24 00: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 @min_lsn = sys.fn_cdc_get_min_lsn('my_captureinstance')
SELECT @max_lsn = sys.fn_cdc_get_max_lsn()

IF @begin_lsn < @min_lsn BEGIN
  SELECT @begin_lsn = @min_lsn
END

IF @end_lsn > @max_lsn BEGIN
  SELECT @end_lsn = @max_lsn
END

SELECT * FROM cdc.fn_cdc_get_net_changes_my_captureinstance(@begin_lsn, @end_lsn, 'all')
person Moby Duck    schedule 23.06.2015

Для mecdc.fn_cdc_get_net_changes_dbo_Points требуется больше аргументов. Найдите определение этой функции, чтобы увидеть, что она ожидает, чтобы вы могли дать ей правильное количество аргументов. Это одна из ваших функций, поэтому никто из нас не знает, какими должны быть аргументы.

person John Tseng    schedule 26.06.2013