Azure Data Factory V1存储过程复制活动参数命名问题咨询
我之前在使用ADF V1的复制活动结合存储过程时,也碰到过这个一模一样的限制——确实挺头疼的,因为ADF硬要求第一个表类型参数名必须和输入数据集的tableName完全一致,但SQL Server的存储过程参数又不允许带Schema前缀(比如@WMST.DLYTRN这种格式是非法的)。给你几个实际验证过的可行方案:
方案1:修改输入数据集,用Query指定带Schema的表,去掉tableName的Schema前缀
这是最直接的修改方式,不需要动源端或目标端的数据库对象:
- 把Oracle输入数据集的
tableName属性改成DLYTRN(去掉WMST.前缀) - 在数据集的
query属性中明确指定Schema和表:SELECT * FROM WMST.DLYTRN - 这样ADF识别的
tableName就是不带Schema的DLYTRN,刚好匹配存储过程的@DLYTRNTable参数
这种方式的好处是灵活,还能顺便过滤数据(比如加WHERE条件),只要确保ADF的Oracle链接服务账号有访问WMST Schema的权限就行。
方案2:在Oracle源端创建同义词(Synonym)
如果不想修改ADF的数据集配置,可以在Oracle数据库里给目标表创建一个不带Schema前缀的同义词:
CREATE SYNONYM DLYTRN FOR WMST.DLYTRN;
之后把输入数据集的tableName改成DLYTRN,ADF读取同义词就等同于读取原表,这样参数名就能完美匹配@DLYTRNTable了。
这个方案适合源端允许创建数据库对象的场景,不需要改动ADF的任何配置,对后续维护也友好。
方案3:在Azure SQL端创建代理存储过程做参数转发
如果既不想动源端,也不想改ADF的数据集配置,可以在目标Azure SQL数据库里创建一个“代理”存储过程,用合法的方式接收适配后的参数,再转发给真正的存储过程:
CREATE PROCEDURE [wms].[spPersistDlytrn_Proxy] @WMST_DLYTRN [wms].[DLYTRNTableType] READONLY -- 用下划线替换原表名里的点 AS BEGIN SET NOCOUNT ON; -- 转发给实际的存储过程 EXEC [wms].[spPersistDlytrn] @DLYTRNTable = @WMST_DLYTRN; END
然后在ADF的复制活动里配置这个代理存储过程,同时把参数映射设置为WMST_DLYTRN(和输入数据集tableName转换后的格式一致)。如果想用更贴近原表名的参数,也可以用方括号转义:@[WMST.DLYTRN],只要确保ADF参数名和代理存储过程参数名完全匹配即可。
这个方案适合源端和ADF配置都不能动的场景,相当于在目标端做一层适配。
内容的提问来源于stack exchange,提问作者soderstromOlov

