我收到此错误 “尝试执行以下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
答案 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')