9

我在我的 MS SQL 2008 数据库上激活了更改数据捕获 (CDC),并使用以下代码将新表添加到数据捕获中:

EXEC sys.sp_cdc_enable_table
@source_schema ='ordering',
@source_name ='Fields',
@role_name = NULL,
@supports_net_changes = 0;

但是,每当我尝试使用该sys.fn_cdc_get_min_lsn(@TableName)函数从跟踪表中选择更改时

 SET @Begin_LSN = sys.fn_cdc_get_min_lsn('Fields')

我总是得到零值。

我尝试使用以下拼写添加架构名称:

 SET @Begin_LSN = sys.fn_cdc_get_min_lsn('ordering.Fields')

但这没有帮助。

4

3 回答 3

20

我的冒险是假设sys.fn_cdc_get_min_lsn()接受表名。我主要被 MSDN 文档中的示例误导了,可能并没有检查参数的确切含义。

事实证明,sys.fn_cdc_get_min_lsn()接受捕获实例名称,而不是表名!

粗略浏览一下我当前的捕获实例:

SELECT capture_instance FROM cdc.change_tables

返回正确的参数名称:

ordering_Fields

因此,应该使用下划线作为模式分隔符,而不是 SQL Server 中常见的点表示法。

于 2013-04-30T10:56:10.063 回答
2

上面的答案是正确的。或者,您可以将附加参数capture_instance添加到 cdc enable

EXEC sys.sp_cdc_enable_table
@source_schema ='ordering',
@source_name ='Fields',
@capture_instance = 'dbo_Fields'
@role_name = NULL,
@supports_net_changes = 0;

然后在 min_lsn 函数中使用 capture_instance 字符串

SET @Begin_LSN = sys.fn_cdc_get_min_lsn('dbo_Fields')

将返回第一个 LSN,而不是 0x00000000000000000000。

这在尝试 从 SQL 调用时解决错误“为过程或函数 cdc 提供的参数数量不足 ...”时特别有用

cdc_get_net_changes_Fields(@Begin_LSN, sys.fn_cdc_get_max_lsn(), 'all')

这只是意味着“LSN超出预期范围”

于 2014-01-22T04:03:50.910 回答
2

我知道这在这篇文章中大部分已经解释过了,但我想我会把晚上的 CDC 之旅放在一起

  1. 这个错误:

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

可能是因为你的 LSN 太低了0x00

这反过来可能是因为您在 with 中输入了错误的实例名称fn_cdc_get_min_lsn

SELECT * FROM cdc.change_tables它来找到它

最后确保你使用 binary(10)来存储你的 LSN。如果你使用 just varbinaryor binary,你会再次得到0x00. 这显然是对我嘲笑所有那些使用varchar并想知道为什么他们的字符串被截断为一个字符的菜鸟的回报。

示例脚本:

declare @S binary(10)
declare @E binary(10)

SET @S = sys.fn_cdc_get_min_lsn('dbo_YourTable')
SET @E = sys.fn_cdc_get_max_lsn()

SELECT @S, @E

SELECT * 
FROM [cdc].[fn_cdc_get_net_changes_dbo_issuedToken2]
(
@S,@E,'all'
)
于 2018-06-18T13:13:32.097 回答