看似有效的查询表中最新跟踪更改的代码
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
此错误消息有些误导,基本上暗示某些参数可能超出范围。由于表函数的限制,该消息未进一步定制。
零值 (0x00000000000000000000
) 不是有效值。如果
sys.fn_cdc_get_min_lsn()
找不到适当的捕获实例名称,则返回此值。该名称可能与实际的表名称有所不同。请参阅此问题了解更多详情 请参阅
以下问题了解更多详情。
函数第一个参数中的第一个拼写错误
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() 返回的字符串值时会起作用
检查使用函数
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);
当我调用一个有参数的函数时,我忘记输入这些参数。在 windowsform 数据集中,我必须使用类似
Select * from func_for_something(@id, @name)
的东西。但是,如果我在没有参数的情况下使用
Select * from func_for_something()
编写数据集,则在 Visual Studio 中我没有尝试。但是,当我在程序中的某个位置触发此函数时,我看到了像您一样的错误消息。所以结论是:当你使用有参数的函数时,不要忘记添加参数。 :) 抱歉我的英语水平不够