我在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')
但这没有帮助。
答案 0 :(得分:15)
我的错误是假设sys.fn_cdc_get_min_lsn()
接受表名。我大多被MSDN文档中的示例误导,可能并没有检查参数的确切含义。
事实证明sys.fn_cdc_get_min_lsn()
接受捕获实例名称,而不是表名!
粗略地浏览一下我当前的捕获实例:
SELECT capture_instance FROM cdc.change_tables
返回正确的参数名称:
ordering_Fields
因此,应该使用下划线作为架构分隔符,而不是点符号,因为它在SQL Server中很常见。
答案 1 :(得分:1)
以上答案是正确的。或者,您可以向cdc enable
添加其他参数 capture_instanceEXEC sys.sp_cdc_enable_table
@source_schema ='ordering',
@source_name ='Fields',
@capture_instance = 'Fields'
@role_name = NULL,
@supports_net_changes = 0;
然后使用min_lsn函数中的capture_instance字符串
SET @Begin_LSN = sys.fn_cdc_get_min_lsn('Fields')
将返回第一个LSN,而不是0x00000000000000000000。
这在尝试解决错误时非常有用 “调用
时从SQL提供的过程或函数cdc ...”的参数数量不足cdc_get_net_changes_Fields(@Begin_LSN, sys.fn_cdc_get_max_lsn(), 'all')
这仅仅意味着“LSN超出预期范围”
答案 2 :(得分:1)
我知道这篇文章大部分都已在这篇文章中解释过,但我想我会把我的夜晚之旅放在CDC上
"为程序或功能cdc提供的参数数量不足......"
可能是由于您的低LSN为0x00
这可能是因为您在fn_cdc_get_min_lsn
中添加了错误的实例名称。
使用SELECT * FROM cdc.change_tables
找到它
最后请确保使用二进制(10)来存储您的LSN。如果您只使用varbinary
或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'
)