【问题标题】:Verify Rows Filtering Expression return error "cannot parse expression", "cannot return as a Date"验证行过滤表达式返回错误“无法解析表达式”、“无法作为日期返回”
【发布时间】:2019-11-13 20:04:51
【问题描述】:

我已经获得了从 DB2LUW 到 Microsoft SQL Server 的 Infosphere CDC 环境。

因为我们遇到了磁盘空间问题,我们需要过滤复制;所选数据将按日期列复制。

源表插入方式为APPEND,很少更新。在创建订阅过滤选项卡期间,当我运行验证按钮时,它会返回如下错误。

BUSINESS_DATE column data type is TIMESTAMP(0).
Error message details :
cannot parse expression : BUSINESS_DATE > '2017-12-18 00:00:00.0"
Cannot return as a date

我已阅读文档,但我无法理解它,并且没有满足我的场景的示例表达式。我不确定为什么 CDC 无法使用时间戳数据类型列执行过滤。

当我尝试将我的时间戳列转换为 char 格式时,CDC 发现它是有效的:

%TOCHARFORMAT(BUSINESS_DATE,'yyyy.MM.dd HH:mm:ss') > '2017.12.18 00:00:00'
%TOCHARFORMAT(BUSINESS_DATE,'yyyyMMdd') > '20171218'

由于我没有任何开发环境,我没有足够的信心运行它。

我预计会出现一些性能问题,因为 (business_date) 的每一行都需要首先转换,然后才能与过滤条件进行比较。

最后,我的表映射被另一列(bigint 数据类型)过滤。我只是很好奇为什么刷新过程似乎没有使用任何索引来过滤行(CDC在源数据库中运行的查询没有使用任何过滤器),尽管它有助于加速刷新,因为不是每个数据都会需要插入到目标表中。

CDC 能否使用时间戳数据类型列执行过滤?有什么建议吗?

【问题讨论】:

    标签: sql-server cdc ibm-data-replication


    【解决方案1】:

    我认为原始过滤器表达式的问题在于文字被评估为字符数据类型。我想你不能通过做一些转换来比较不同的数据类型。

    关于刷新,CDC 总是执行全表扫描。我想原因是行过滤可能包括任何类型的 SQL where 子句都不能支持的测试,包括用户出口和日志控制列,因为当它抓取事务日志时,它没有使用由数据库,因此这避免了刷新和镜像中的过滤逻辑之间不匹配的任何问题,如果刷新使用数据库过滤器而镜像使用本机过滤器,则可能发生这种问题。

    【讨论】:

    • 刷新时,IDR CDC 无权访问日志控制字段,但可以运行用户出口。
    猜你喜欢
    • 2019-03-22
    • 2019-03-23
    • 2017-09-22
    • 2017-08-13
    • 2021-01-18
    • 2020-09-19
    • 2019-06-25
    • 2016-01-21
    • 2021-09-16
    相关资源
    最近更新 更多