【问题标题】:Scalar function fn_cdc_get_min_lsn() constantly returns '0x00000000000000000000' for valid table names?标量函数 fn_cdc_get_min_lsn() 不断为有效的表名返回“0x00000000000000000000”?
【发布时间】:2013-04-30 10:56:10
【问题描述】:

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

但这没有帮助。

【问题讨论】:

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


    【解决方案1】:

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

    原来sys.fn_cdc_get_min_lsn()接受捕获实例名,而不是表名!

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

    SELECT capture_instance FROM cdc.change_tables
    

    返回正确的参数名称:

    ordering_Fields
    

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

    【讨论】:

    • ...尽管正如@kevin 指出的那样,仅仅替换点并不总是有效
    • 我确定你是对的,但即使我将实例名称从 cdc.change_tables 直接复制粘贴到 fn_cdc_get_min_lsn,我也会得到可怕的 0x00
    • 2021 年 4 月,这对我有帮助。谢谢@alexander-galkin 我也以某种方式误解了参数值。
    • 另外,还要检查SQL Server代理是否开启。
    【解决方案2】:

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

    1. 这个错误:

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

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

    这又可能是因为您在fn_cdc_get_min_lsn 中输入了错误的实例名称。

    使用SELECT * FROM cdc.change_tables 找到它

    最后确保您使用 binary(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'
    )
    

    【讨论】:

      【解决方案3】:

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

      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。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-29
        • 2016-11-09
        • 2019-09-28
        相关资源
        最近更新 更多