更改数据捕获:无效的对象名称' sys.fn_cdc_get_max_lsn'和' sys.fn_cdc_get_min_lsn'

时间:2016-10-07 16:49:13

标签: sql-server sql-server-2012

我试图成为一名优秀的SQL公民并且直接使用CDC表,并使用TVFs,它对我来说是悲惨的。(SQL 2012 Enterprise SP3 ),遵循模式..

DECLARE @from_lsn binary(10), @to_lsn binary(10)
SET @from_lsn =
   sys.fn_cdc_get_min_lsn('mytable')
SET @to_lsn   = sys.fn_cdc_get_max_lsn()
SELECT * FROM cdc.fn_cdc_get_all_changes_mytable
  (@from_lsn, @to_lsn, N'mytable');
GO

我收到了错误

  

无效的对象名称' cdc.fn_cdc_get_all_changes_mytable'。

然后我发现我需要在函数上放置表名前面的模式,但后来得到了这个:

  

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

所以我尝试调试lsn值以查看它们是否为NULL / 0,因为其他帖子遇到此问题但后来发现这些函数不存在。

enter image description here

如您所见,我可以在master db中找到这些函数。谁知道我做错了什么?

我看到这个Microsoft connect article,其中有人遇到了同样的问题,他们的解决方案是站不住脚的。

1 个答案:

答案 0 :(得分:1)

这些函数不返回表,它们是标量;所以使用变量。

DECLARE @from_lsn binary(10)
SET @from_lsn = sys.fn_cdc_get_min_lsn(N'schema_table')
SELECT @from_lsn 

您还更改了TechNet文章中的代码,将最终TVF中的第三个参数替换为N'all'

DECLARE @from_lsn binary(10), @to_lsn binary(10)
SET @from_lsn = sys.fn_cdc_get_min_lsn(N'schema_table')
SET @to_lsn   = sys.fn_cdc_get_max_lsn()
SELECT @from_lsn,@to_lsn 
SELECT * FROM cdc.fn_cdc_get_all_changes_schema_table(@from_lsn, @to_lsn, N'all');
GO

过滤器选项不是捕获实例名称或表名称。 他们是:

cdc.fn_cdc_get_all_changes_capture_instance ( from_lsn , to_lsn , '<row_filter_option>' )  

<row_filter_option> ::=  
{ all  
 | all update old  
}  

请参阅cdc.fn_cdc_get_all_changes_capture_instance

注意:如果您在为表启用CDC时使用了特定的capture_instance名称,请在MSDN文档中出现单词capture_instance作为参数时使用该名称。如果您还没有使用capture_instance名称,那么它可能是schema_table,例如dbo_mytable