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

如何在Azure Data Factory的Excel-Azure SQL ETL中验证日期与国家组合唯一性

解决Azure Data Factory中Excel数据重复校验的问题

一、先理清楚核心校验逻辑

从你给出的SQL语句来看,你是想按月(当前年的当月)+Country维度校验数据是否已存在,避免重复上传整个工作表。下面是具体的落地步骤:

二、分步实现方案

1. 预处理Excel数据,解决空值问题

首先得把Excel里的空值处理掉,不然后续校验会出错:

  • 用Derived Column活动对Excel的Date和Country列做预处理:
    Date: iif(isNull(Date), toDate('1900-01-01'), Date)
    Country: iif(isNull(Country), 'Unknown', Country)
    
    把空Date转成默认日期,空Country转成统一标识,避免后续SQL查询报错。
  • 同时在Excel数据集的设置里,勾选「跳过空行」,直接过滤掉完全空的行。

2. 参数化查询SQL数据库,校验重复

用Lookup活动连接Azure SQL,通过参数化查询动态传入Excel的校验维度:

  • 先在管道里定义两个参数:excelMonth(从预处理后的Date取月份)、excelCountry(预处理后的Country值)
  • 把你的SQL改成参数化版本,同时兼容空值转换后的情况:
    SELECT COUNT(1) AS ExistCount
    FROM Budget
    WHERE 
      (MONTH(ExcelDate) = @pipeline().parameters.excelMonth OR @pipeline().parameters.excelMonth = 1)
      AND YEAR(ExcelDate) = YEAR(GETDATE())
      AND (Country = @pipeline().parameters.excelCountry OR @pipeline().parameters.excelCountry = 'Unknown')
    
    这里的1对应默认日期1900-01-01的月份,确保空Date的情况下不会误匹配。

3. 用If Condition控制流转

通过Lookup的输出判断是否存在重复:

  • 条件表达式写:@greater(activity('Lookup_SQL_Count').output.firstRow.ExistCount, 0)
  • 如果条件为真(已存在):可以加个Set Variable标记“跳过上传”,或者直接用Stop活动终止管道;
  • 如果条件为假(不存在):继续执行你原来的ETL上传流程。

4. 额外注意点

  • 在Azure SQL的Budget表中,给Country字段设置默认值,避免插入空值导致后续校验逻辑混乱;
  • Excel数据集的连接选项里,勾选「将空字符串视为null」,确保空值能被正确识别处理。

三、如果需要单条记录校验的补充

要是你想校验每条记录的Date+Country组合(而非整个工作表),可以用Data Flow实现:

  • 用Lookup转换连接SQL的Budget表,关联条件设为Excel.Date = Budget.ExcelDate AND Excel.Country = Budget.Country;
  • 用Filter转换过滤掉已经匹配到的记录,只把未存在的记录写入SQL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:56:20