Azure Synapse将ADLS文件名列表写入文件时遇转换错误求助
问题分析与解决方案
错误根源
你遇到的类型转换错误核心原因有两点:
- Lookup活动返回的是结构化行集对象,而非纯字符串,直接传递给Copy Activity会触发类型转换失败。
- 你的SQL逻辑将文件名拼接成
[name1,name2]格式的JSON字符串,既不符合“每行一个文件名”的输出需求,也增加了后续处理的复杂度。
修正步骤
方案一:调整Lookup+Copy Activity配置
修改Lookup的SQL语句
去掉字符串拼接逻辑,直接返回每行一个文件名的结果集:declare @output varchar(max) set @output ='@{activity('Get Metadata').output.childitems}' select name from OpenJson(@output) with(name varchar(max) '$.name')此时Lookup会输出包含多行的数据集,每行对应一个文件名。
配置Copy Activity
- 源端:选择Lookup作为源,确保读取其返回的行集数据。
- 接收器端:
- 目标存储选ADLSv2,文件名为
filename_list.txt。 - 文件格式选择文本格式,设置行分隔符为
\n(换行符),列分隔符留空或设为无(仅需单列输出)。
- 目标存储选ADLSv2,文件名为
- 映射:将Lookup输出的
name列直接映射到接收器的唯一列。
方案二:简化流程(无需Lookup)
用变量收集文件名,直接写入文件,更高效:
- 新建字符串变量
fileNames,初始值为空。 - 添加For Each活动,迭代对象设为
@activity('Get Metadata').output.childitems。 - 在For Each内部添加Append Variable活动,追加内容为
@{item().name}(注意末尾添加换行符,确保每个文件名占一行)。 - 最后用Copy Activity:
- 源选内联数据集,内容设为
@variables('fileNames')。 - 接收器选ADLSv2的
filename_list.txt,文件格式为文本。
- 源选内联数据集,内容设为
验证
运行流程后,filename_list.txt会生成你需要的每行一个文件名的格式。
内容的提问来源于stack exchange,提问作者rp346
相关产品推荐
相关产品推荐

