如何在Azure数据工厂的存储过程活动中传递动态@pipeline().参数和值
我已经创建了表“testconfig”插入数据名称&ProcedureParameterName
INSERT INTO testconfig
VALUES ('storeprocedurename','''{'',''"parm1": { "value": '', string(pipeline().parameters.parm1), '', "type": "Int64" },'',''"parm2": { "value": "'', pipeline().parameters.parm2, ''", "type": "String" }'', ''}''')
通过查找活动从数据库中提取存储过程名称和存储过程参数。
通过使用 foreach 活动,我通过了
@activity('Get Procedure Name').output.value
每个活动内部设置变量
@concat(item().ProcedureParameterName)
在存储过程活动中,通过 Json 表达式动态传递存储过程活动中的参数。当我通过手动执行时相同的脚本。从数据库查找活动传递时失败。请指导我
看起来您在插入查询中给出了字符串和管道表达式的组合,以便它可以使用
concat()
函数将参数值从查找活动传递到 JSON 来生成所需的 JSON 字符串。
在存储过程活动中通过 Json 表达式动态传递存储过程活动中的参数..当我通过手动执行时相同的脚本..从数据库查找活动传递时失败。
ADF 动态表达式不支持嵌套动态表达式(如果动态表达式位于字符串中,则无法执行该表达式)。当您使用
concat()
直接将 JSON 传递给存储过程时,动态表达式会标识参数并提取参数值。 但是当您尝试使用查找活动输出获取那些内容时,参数表达式将变成嵌套表达式。 ADF 动态表达式仅识别查找活动输出并将内部动态表达式识别为字符串 ("pipeline().parameters.parm1"
)。
要将参数值动态传递到 JSON,请勿提供与您想要提供给
concat()
相同的表达式。您可以像下面这样更改插入查询。
insert into testconfig values('mysp1','{"parm1":{"value":pipeline().parameters.parm1,"type":"Int64"},"parm2":{"value":"pipeline().parameters.parm2}","type":"String"}}')
使用查找活动获取此表值,并将查找输出数组提供给 for-each。在 for-each 中,将
pipeline().parameters.<parameters>
中的 item().ProcedureParameterName
替换为所需参数,如下所示。
@replace(replace(item().ProcedureParameterName,'pipeline().parameters.parm1',string(pipeline().parameters.parm1)),'pipeline().parameters.parm2',pipeline().parameters.parm2)
每次迭代都会生成如下 JSON 字符串。
现在,您可以使用 存储过程活动 或脚本活动 将此字符串变量传递给存储过程参数。
在脚本活动中,您可以使用以下脚本直接调用存储过程。在这里,
DECLARE @Json NVARCHAR(MAX)
SET @Json = N'@{variables('myjson')}'
EXEC @{item().Name} @JsonInput = @Json;