You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ADF中Business Central API至Azure SQL增量加载过滤失效求助

解决ADF中Business Central API增量加载过滤失效问题

核心问题拆解

Business Central的OData API必须通过**$filter**参数在请求层面做数据过滤,ADF复制活动里的常规过滤配置对它不生效,这就是你只能全量拉取数据、没法实现增量加载的核心原因。

实操解决方案

1. 直接在复制活动源端构造OData过滤参数

  • 先用Lookup活动从SQL水印表里取出上次加载的时间戳(比如last_load_date)
  • 打开复制活动的源设置,找到「附加属性」,添加$filter参数,值用动态表达式拼接:
    concat('lastModifiedDateTime gt ', '''', activity('Lookup_Watermark').output.firstRow.last_load_date, '''')
    
    注意:要对应BC API实体的时间戳字段名,部分实体用systemModifiedAt,先查API元数据确认准确字段。

2. 先验证API本身支持过滤

  • 手动调用API测试过滤是否有效,示例请求:
    GET https://api.businesscentral.dynamics.com/v2.0/{tenantId}/api/v2.0/companies/{companyId}/customers?$filter=lastModifiedDateTime gt '2024-01-01T00:00:00Z'
    
    如果返回过滤后的数据,说明API正常;若无效,检查BC用户权限——必须给该实体开读取权限,且API启用了OData过滤(BC默认支持,但需确认实体允许)。

3. 避免用Lookup/For Each处理API全量数据

  • Lookup活动针对BC API时,是先拉全量数据再过滤,效率极低且易失效,必须直接在API请求层面完成过滤
  • 用For Each遍历数据前,也要先通过$filter缩小数据范围,再执行后续操作

4. 同步更新水印表

  • 复制活动执行成功后,用脚本活动运行SQL更新水印表,把last_load_date设为当前UTC时间,确保下次只拉取增量数据:
    UPDATE watermark_table SET last_load_date = GETUTCDATE() WHERE table_name = 'BC_Customers'
    

避坑提醒

  • 不要在ADF数据集层面设置过滤,BC API不识别这类规则,必须通过OData的$filter参数传递条件
  • 时间戳必须是ISO 8601格式(比如2024-05-20T12:00:00Z),否则API会忽略过滤条件

内容的提问来源于stack exchange,提问作者David Thorp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:40:00