Azure Data Factory复制活动配置Azure SQL接收器存储过程失败咨询
问题根因与修正方案
你当前的配置思路核心偏差在存储过程的写法和ADF对Sink存储过程的传参机制不匹配,也是绝大多数ADF新用户踩的共性坑:
- ADF Copy活动配置「使用Sink存储过程」时,只会把从源端读取的全量批量结果集,以你预先定义的用户定义表类型(UDTT)作为唯一的表值参数传入存储过程,不会逐行拆分数据、单独传标量参数。你现在的存储过程额外加了@BaseKey、@GISKey、@ActiveFrom三个独立标量入参,ADF根本无法识别这几个参数的传值来源,运行时必然报参数缺失的错误。
- 你存储过程内部的插入逻辑完全没有处理传入的@Patch表值参数,哪怕参数能正常传递,源端拉来的批量数据也根本不会被写入目标表。
第一步:修正为符合ADF规则的存储过程定义
你之前创建的UDTT(用户定义表类型)本身没有问题,不需要修改,只需要重写存储过程:
-- 已创建的UDTT无需调整 CREATE TYPE [dbo].[Patch] AS TABLE( [BaseKey] int, [GISKey] [varchar](10), [ActiveFrom] datetime ) GO DROP PROC IF EXISTS dbo.spCopyPatch GO -- 存储过程仅保留UDTT类型的只读表值参数,删除多余的标量入参 CREATE PROC dbo.spCopyPatch @Patch dbo.Patch READONLY AS -- 直接批量插入表值参数中的全量数据,不要依赖标量变量单行写入 INSERT INTO dbo.Patch( BaseKey,GISKey,ActiveFrom) SELECT BaseKey,GISKey,ActiveFrom FROM @Patch; GO
第二步:调整ADF Copy活动的Sink配置
- 保存上面的存储过程后,回到ADF的Copy活动配置,重新从下拉列表选择最新的
spCopyPatch,让ADF自动重新拉取存储过程的参数结构,清掉之前缓存的旧版本参数列表。 - 检查ADF自动识别出来的UDTT参数结构,确认列名、数据类型、列顺序和你在Azure SQL里定义的
dbo.Patch类型完全一致——ADF传表值参数是按位置映射的,不是按列名匹配,顺序错了就会出现数据错位、类型不兼容的报错。 - 补全权限检查:ADF连接Azure SQL使用的服务账号,必须同时拥有该存储过程的
EXECUTE权限、以及对应UDTT类型的EXECUTE权限,漏给UDTT权限是这类报错的高频原因。
注意:如果你的源端表列和UDTT的列顺序不一致,一定要在Copy活动的「映射」面板里手动调整列顺序,和UDTT的列结构对齐。
内容的提问来源于stack exchange,提问作者wwnde
相关产品推荐
相关产品推荐

