验证行过滤表达式返回错误“无法解析表达式”,“无法作为日期返回”

时间:2019-11-13 20:04:51

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

我有从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无法使用timestamp数据类型列执行过滤。

当我尝试将时间戳列转换为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可以使用timestamp数据类型列执行过滤吗?有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我认为您的原始过滤器表达式的问题是文字被评估为字符数据类型。我想您不能通过强制转换在不同数据类型之间进行比较。

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