标量函数fn_cdc_get_min_lsn()不断返回'0x00000000000000000000'作为有效的表名?

时间:2013-04-30 10:56:10

标签: sql-server sql-server-2008 cdc

我在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')

但这没有帮助。

3 个答案:

答案 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_instance
EXEC 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上

  1. 此错误:
  2.   
        

    "为程序或功能cdc提供的参数数量不足......"

      

    可能是由于您的低LSN为0x00

    这可能是因为您在fn_cdc_get_min_lsn中添加了错误的实例名称。

    使用SELECT * FROM cdc.change_tables找到它

    最后请确保使用二进制(10)来存储您的LSN。如果您只使用varbinarybinary,则会再次获得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'
    )