ADF复制活动启用动态范围分区时触发空值参数错误求助
解决ADF复制活动动态范围分区的"dictionary cannot be null"错误
错误原因分析
从日志文件名sql_some_table_name_crt_ts_NA_09242023062959_0.txt中的NA标识,结合报错信息,可定位问题核心:ADF在生成动态范围分区查询时,无法获取有效分区边界值,导致参数字典为空,触发System.ArgumentNullException。可能的诱因包括:
- JSON配置存在语法错误,导致源配置解析异常
- 分区列
crt_ts的数据类型与ADF动态分区逻辑不兼容 - 手动指定的上下边界格式不符合SQL Server的日期解析规则
- 自托管IR版本存在动态分区的兼容性bug
解决方案
1. 修复JSON配置语法错误
查看复制活动的解析输入,additionalColumns数组中的对象末尾存在多余逗号,这会导致JSON解析失败,进而影响分区逻辑的执行。修正后的配置如下:
"additionalColumns": [ { "name": "ADF_RUN_ID" } ]
2. 确保分区列数据类型兼容
- 确认SQL Server中
crt_ts列的类型为datetime/datetime2/smalldatetime,避免使用字符串类型存储日期时间值 - 如果
crt_ts是字符串类型,需先将其转换为日期时间类型,或在sqlReaderQuery中显式转换,例如:
select somecolumns, CONVERT(datetime2, crt_ts, 120) as crt_ts from some_table where ?DfDynamicRangePartitionCondition
3. 调整分区边界格式
将手动指定的上下边界改为SQL Server兼容的日期格式,替换原ISO 8601带T的格式:
"partitionSettings": { "partitionColumnName": "crt_ts", "partitionUpperBound": "2024-10-16 12:59:59", "partitionLowerBound": "2022-09-01 00:00:00" }
4. 尝试自动获取边界值
如果手动指定边界仍有问题,可移除partitionUpperBound和partitionLowerBound配置,让ADF自动查询crt_ts列的最大/最小值作为边界,但需确保源表中存在数据(空表会导致边界获取失败)。
5. 更新自托管IR版本
检查自托管集成运行时的版本,升级至最新稳定版,旧版本可能存在动态范围分区的已知bug。
验证方法
修改配置后,运行小规模测试任务:
- 查看生成的日志文件名,确认其中包含有效的边界值而非
NA - 查看复制活动的监控日志,确认分区查询语句正常生成并执行
内容的提问来源于stack exchange,提问作者Rishav Putatunda
相关产品推荐
相关产品推荐

