如何在ADF中逐个将ADLS的JSON文件数据传入存储过程?
ADF逐个处理ADLS JSON文件并调用存储过程实现方案
1. 获取目标目录下所有JSON文件列表
使用Get Metadata活动,配置ADLS Gen2数据集指向存放JSON的目录,勾选「子项」选项。执行后该活动会返回目录下所有文件的详细信息(包括文件名、完整路径等)。
2. 用ForEach循环实现逐个处理
添加ForEach活动,将其迭代项设置为:
@activity('Get Metadata活动名称').output.childItems
如果需要顺序处理文件,可在ForEach的「设置」里将「顺序」改为「是」;若允许并行处理,保持默认并行即可(默认并行度20,可按需调整)。
3. 循环内读取单个JSON文件内容
在ForEach内部添加Lookup活动:
- 配置ADLS数据集,动态指定文件路径为
@item().path(完整路径)或@item().name(相对路径,需确保数据集根目录正确)。 - 关闭「第一行仅」选项,这样Lookup会读取整个JSON文件的内容并返回为数组格式。
4. 循环内调用存储过程插入数据
接着添加存储过程活动,连接到目标SQL数据库的数据集:
- 选择对应的存储过程,设置参数(比如参数名
@JsonContent),参数值绑定为:
@string(activity('读取单个JSON的Lookup活动名称').output.value)
将JSON数组转为字符串传入存储过程。
5. 存储过程解析JSON并插入表
编写SQL存储过程,用OPENJSON解析传入的JSON字符串,映射字段后插入目标表。示例代码:
CREATE PROCEDURE dbo.InsertJsonToTable @JsonContent NVARCHAR(MAX) AS BEGIN SET NOCOUNT ON; INSERT INTO YourTargetTable (Col1, Col2, Col3) SELECT JSON_VALUE(json_item, '$.field1') AS Col1, JSON_VALUE(json_item, '$.field2') AS Col2, JSON_QUERY(json_item, '$.field3') AS Col3 FROM OPENJSON(@JsonContent) AS json_item; END
关键注意点
- 若JSON文件较大,Lookup活动可能存在性能瓶颈,可改用Copy活动将文件内容先写入SQL临时表,再调用存储过程处理。
- 调整ForEach并行度时,需考虑SQL数据库的承载能力,避免并发过高导致性能问题。
- 确保ADLS数据集的权限配置正确,保证ADF能正常读取文件。
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

