我试图成为一名优秀的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,因为其他帖子遇到此问题但后来发现这些函数不存在。
如您所见,我可以在master db中找到这些函数。谁知道我做错了什么?
我看到这个Microsoft connect article,其中有人遇到了同样的问题,他们的解决方案是站不住脚的。
答案 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
。