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

如何通过Azure Synapse Pipeline执行SQL脚本文件?类型转换错误求助

解决方案

报错原因

你直接将@item()传入Script Activity,但item()是GetMetadata返回的文件对象(包含name、type、folderPath等属性),并非SQL脚本的字符串内容,而Script Activity的NonQuery脚本要求传入字符串类型的SQL语句,因此触发类型转换错误。

具体配置步骤

1. 调整ForEach遍历范围(可选但推荐)

在ForEach的Items中添加过滤条件,确保只遍历文件而非文件夹:

@filter(activity('GetMetadata01').output.childItems, @equals(item().type, 'File'))

2. 在ForEach内部添加Lookup Activity读取脚本内容

添加一个Lookup活动(命名为Lookup_SQL_Script),用于读取ADLS中对应SQL文件的内容:

  • 数据源:选择你的ADLS Gen2存储账户,设置文件路径为:
    @concat(item().folderPath, item().name)
    
    (若文件直接在容器根目录,可简化为@item().name)
  • 文件格式:选择DelimitedText,并进行如下配置:
    • 第一行作为标题:否
    • 列分隔符:设置一个SQL脚本中不会出现的字符(如~或|),确保整个文件内容被识别为单个列
    • 编码:UTF-8

3. 修改Script Activity的脚本配置

将Script Activity的NonQuery脚本内容改为Lookup活动读取到的字符串:

@activity('Lookup_SQL_Script').output.firstRow.Column1

(若在Lookup的Projection中自定义了列名,比如sql_script,则改为@activity('Lookup_SQL_Script').output.firstRow.sql_script)

额外注意事项

  • 若SQL脚本包含GO命令:Synapse Dedicated SQL Pool不支持GO作为批处理分隔符,需将GO替换为分号;,或拆分脚本为多个Script Activity执行。
  • 权限检查:确保Pipeline的托管身份/服务主体拥有ADLS容器的读取权限,以及Synapse SQL池的CREATE PROCEDURE等执行权限。
  • 大文件处理:若脚本文件过大,Lookup无法完整读取时,可先用Copy Activity将内容写入SQL池临时表,再通过动态SQL读取执行。

内容的提问来源于stack exchange,提问作者John Scott Stensland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:47:02