1

我在尝试执行以下 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

3 回答 3

0

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

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

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

我们建议在使用之前验证要在 TVF 查询中使用的 LSN 边界。空端点或位于捕获实例的有效间隔之外的端点将强制更改数据捕获 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 捕获的日期范围。当我清理它们时——也就是说,开始使用有效的日期范围——随之而来的是良好的结果。

于 2014-04-21T21:42:57.103 回答
0

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

我收到此消息,原因是我的起始 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

于 2015-06-18T15:59:51.223 回答
0

我遇到了同样的问题,Gerald 就在现场——如果我在 CDC 捕获的数据范围内使用 LSN,就没有问题。

我现在用sys.fn_cdc_get_min_lsn('my_captureinstance')and来限制我的 LSN 值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')
于 2015-06-23T16:14:46.407 回答