如何在Azure数据工厂中使用@json表达式在存储过程活动中传递动态@pipeline().参数和值

问题描述 投票:0回答:1

如何在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 表达式动态传递存储过程活动中的参数。当我通过手动执行时相同的脚本。从数据库查找活动传递时失败。请指导我

database azure azure-data-factory adfs
1个回答
0
投票

看起来您在插入查询中给出了字符串和管道表达式的组合,以便它可以使用

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)

enter image description here

每次迭代都会生成如下 JSON 字符串。

enter image description here

现在,您可以使用 存储过程活动脚本活动 将此字符串变量传递给存储过程参数。

enter image description here

在脚本活动中,您可以使用以下脚本直接调用存储过程。在这里,

DECLARE @Json NVARCHAR(MAX)
SET @Json = N'@{variables('myjson')}'

EXEC @{item().Name} @JsonInput = @Json;

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.