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

Azure Data Factory复制源Lookup活动语法错误排查求助

解决ADF增量复制中Copy活动动态查询的预览与架构导入问题

我来帮你梳理下当前遇到的问题,本质都是因为Azure Data Factory在设计阶段没法解析带动态表达式的SQL查询——毕竟那些@{activity(...)}的占位符要到管道运行时才会被替换成实际值,设计时ADF根本认不出这是参数,会直接当成SQL语法的一部分处理。

问题拆解

  • 预览数据按钮置灰:ADF需要静态SQL才能提前拉取数据预览和结构,带动态参数的查询在运行前无法被解析,所以按钮直接不可用,你移除WHERE条件后变回静态SQL,按钮自然就恢复了。
  • 导入架构报错:设计时ADF会尝试直接执行你写的带占位符的字符串,把GetCurrentWatermarkValue当成SQL关键字,肯定会报语法错误。
  • "Query is required"提示:大概率是你在UI里切换表达式模式时,没有正确填充完整的表达式内容导致的。

一步步解决

1. 先用静态SQL完成架构导入

既然动态查询没法在设计时解析架构,我们先临时用静态SQL搞定映射:

  • 打开Copy活动的源设置,把sqlReaderQuery暂时改成静态查询,比如:
    select * from Shipment where CreatedOn <= GETDATE()
    
  • 点击导入架构,等字段映射完成后,再把查询改回之前的动态表达式。

2. 确认动态表达式的正确性

从你贴的JSON配置来看,表达式的格式是对的,但有几个细节要注意:

  • 确保两个Lookup活动的**「仅首行」选项是勾选的**(默认就是启用状态,这时候用output.firstRow.xxx完全正确,不用改成[TableName]——那个是Lookup返回多行结果时的用法)
  • 如果你的CreatedOn是datetime类型,注意单引号的使用:如果WatermarkTable里的WaterMarkValue也是datetime类型,那不需要加单引号,否则会触发类型转换错误。修改后的表达式可以是:
    {
      "value": "select *\nfrom Shipment\nwhere CreatedOn > @{activity('GetCurrentWatermarkValue').output.firstRow.CurrentWatermarkValue} \nand CreatedOn <= @{activity('GetNewWatermarkValue').output.firstRow.NewWatermarkValue}",
      "type": "Expression"
    }
    
  • 如果你是在UI里编辑表达式,一定要点添加动态内容按钮来选择Lookup的输出,别手动敲表达式字符串,很容易打错符号。

3. 预览数据的替代验证方案

因为带动态参数的查询没法在设计时预览,你可以用这些方法验证数据是否正确:

  • 单独运行两个Lookup活动,查看它们的输出值是否符合预期
  • 把Lookup返回的水印值手动拼进SQL,在数据库客户端(比如SSMS)里执行,看看返回的增量数据对不对
  • 直接运行整个管道,查看Copy活动的运行日志,确认复制的数据量是否符合你的预期

最后再检查下你的配置

从你提供的JSON来看,Copy活动的依赖关系是对的(必须等两个Lookup都成功才会运行),只要Lookup能正确返回水印值,动态表达式格式没问题,管道运行时就会自动替换参数,完成增量复制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:02:01