执行更改数据捕获sql查询时出错

时间:2013-06-26 06:56:05

标签: sql sql-server-2008 cdc change-data-capture

我收到此错误 “尝试执行以下sql查询时,为过程或函数cdc.fn_cdc_get_all_changes_提供的参数数量不足”。

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

4 个答案:

答案 0 :(得分:0)

mecdc.fn_cdc_get_net_changes_dbo_Points需要更多参数。找到这个函数的定义,看它期待什么,这样你就可以给它正确数量的参数。这是你的一个功能,所以我们都不知道参数应该是什么。

答案 1 :(得分:0)

迟到了,但对于未来的寻求者。 。

错误消息有点误导。传递给函数的参数需要“有效”,否则您将收到这个令人沮丧的错误消息。

以下是TechNet for SQL Server 2008文章Using Change Data的引用。我建议你阅读这篇文章。

  

我们建议在使用之前验证要在TVF查询中使用的LSN边界。空的端点或端点   在捕获实例的有效期间之外将强制执行   更改数据捕获TVF返回的错误。

     

例如,对所有查询返回以下错误   用于定义查询间隔的参数是否更改   无效,或超出范围,或行过滤器选项无效。

     

Msg 313,Level 16,State 3,Line 1

     

为程序提供的参数数量不足或   function cdc.fn_cdc_get_all_changes_ ...

     

为净更改查询返回的相应错误是   以下内容:

     

Msg 313,Level 16,State 3,Line 1

     

为程序提供的参数数量不足或   function cdc.fn_cdc_get_net_changes_ ...

当我第一次在SQL Server 2012中开始使用这些功能时,我传递了远远超出CDC捕获的日期范围的野性参数。当我清理它们时 - 也就是说,开始使用有效的日期范围 - 接着是好的结果。

答案 2 :(得分:0)

更晚,但对未来的寻求者。 。

我收到此消息,原因是我的Start LSN和Ending 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

答案 3 :(得分:0)

我遇到了同样的问题,并且杰拉尔德也是如此 - 如果我在CDC捕获的数据范围内使用LSN,则没有问题。

我现在用sys.fn_cdc_get_min_lsn('my_captureinstance')sys.fn_cdc_get_max_lsn()限制我的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')