为过程或函数cdc.fn_cdc_get_all_changes_提供的参数数量不足

问题描述 投票:0回答:5

看似有效的查询表中最新跟踪更改的代码

Fields

DECLARE @Begin_LSN BINARY(10), @End_LSN BINARY(10)
SET @Begin_LSN = sys.fn_cdc_get_min_lsn('Fields')
SET @End_LSN = sys.fn_cdc_get_max_lsn()
SELECT * FROM cdc.fn_cdc_get_all_changes_ordering_Fields (@Begin_LSN, @End_LSN, N'all')
GO

生成以下错误消息:

Msg 313, Level 16, State 3, Line 5
An insufficient number of arguments were supplied for the procedure or function cdc.fn_cdc_get_all_changes_ ... .

但是,如果我检查实际值,它们似乎都是有效的(不为空),查询

SELECT @Begin_LSN, @End_LSN, N'all';

退货

0x00000000000000000000  0x00002594000002130001  all
sql-server sql-server-2008 cdc
5个回答
48
投票

此错误消息有些误导,基本上暗示某些参数可能超出范围。由于表函数的限制,该消息未进一步定制。

零值 (

0x00000000000000000000

) 不是有效值。如果
sys.fn_cdc_get_min_lsn()
找不到适当的
捕获实例名称,则返回此值。该名称可能与实际的表名称有所不同。请参阅此问题了解更多详情

请参阅

以下问题了解更多详情。


4
投票
在我的例子中,此错误是由于在表级别多次启用/禁用 CDC 并为同一个表创建了两个捕获实例。我通过在数据库级别禁用 CDC 并再次启用来修复此问题,然后它就可以正常工作了。


1
投票
以上答案是正确的,但我想我应该添加我的情况。我正在保存最后处理的 LSN 以供将来运行。但这是一个开发数据库,它是从产品中恢复的。 CDC 脚本被重新应用,但我丢失了我的历史记录。我需要做的只是删除最后处理的 LSN,这样它就会返回到获取捕获实例的最小 LSN,这让我回到了正确的轨道上。不幸的是,这不是一个非常有用的错误消息。


0
投票
我有一个非常相似的问题,结果是两个问题

函数第一个参数中的第一个拼写错误

fn_cdc_map_time_to_lsn

,它返回一个 NULL 值,然后将该值传递给表 cdc 函数,从而产生 
insufficient number of arguments were supplied for the procedure or function cdc.fn_cdc_get_all_changes_
 消息

错字是

'largest less than or eqaul'

,应该是
'largest less than or equal'

这导致在将日期时间作为字符串作为第二个参数传递时返回 NULL 值。

但令人困惑的是,当传入函数 GETDATE() 而不是从 GETDATE() 返回的字符串值时会起作用

我认为第二个是由于第二个参数使用的日期时间是启用 CDC 之前的值。这是由于多次禁用和启用 CDC 导致的

检查使用函数

fn_cdc_map_lsn_to_time

 转换 
@from_lsn

例如以下返回

0x000024FA000010580039


SET @begin_time = '2023-12-08 17:00:00'; SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
并使用映射 lsn 到时间函数

SELECT sys.fn_cdc_map_lsn_to_time (0x000024FA000010580039)
返回 '2023-12-08 17:04:34.950'

因此,当使用上述时间之前的日期时间和

'largest less than or equal'

 时,会导致 NULL 值
例如下面导致 NULL 返回

SET @end_time = '2023-12-08 17:00:00.000'; SELECT sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
    

-4
投票
我也遇到了和你类似的问题。我的问题比你的更容易,但我想在这里写下以防有人收到类似错误代码的情况。

当我调用一个有参数的函数时,我忘记输入这些参数。在 windowsform 数据集中,我必须使用类似

Select * from func_for_something(@id, @name)

 的东西。但是,如果我在没有参数的情况下使用 
Select * from func_for_something()
 编写数据集,则在 Visual Studio 中我没有尝试。但是,当我在程序中的某个位置触发此函数时,我看到了像您一样的错误消息。

所以结论是:当你使用有参数的函数时,不要忘记添加参数。 :) 抱歉我的英语水平不够

© www.soinside.com 2019 - 2024. All rights reserved.