Azure数据工厂从先前的活动中选择属性“状态”:“成功”

时间:2018-10-02 16:14:41

标签: azure if-statement azure-data-factory azure-data-factory-2

使用Data Factory V2,我正在尝试实现从一个Azure SQL数据库到另一个Azure SQL数据库的数据复制流。

我想执行条件活动If Condition取决于管道先前执行的活动是否成功,但是在要包含在If Condition活动中的表达式中,我无法选择输出属性"status": "Succeeded"

If Condition活动之前,我有两个数据复制活动。

我向流程中添加了If Condition活动,因为复制数据后要执行的任务取决于所有复制活动的成功。

如果所有复制活动均正确执行,则将执行true条件。如果只有一个复制活动成功而另一个失败,则执行错误条件

每个复制活动的输出如下:

Output
{
    "dataRead": 213156,
    "dataWritten": 213156,
    "rowsRead": 3554,
    "rowsCopied": 3554,
    "copyDuration": 4,
    "throughput": 52.04,
    "errors": [],
    "effectiveIntegrationRuntime": "DefaultIntegrationRuntime (West Europe)",
    "usedDataIntegrationUnits": 4,
    "usedParallelCopies": 1,
    "executionDetails": [
        {
            "source": {
                "type": "AzureSqlDatabase"
            },
            "sink": {
                "type": "AzureSqlDatabase"
            },
            "status": "Succeeded",
            "start": "2018-10-02T13:42:37.7396813Z",
            "duration": 4,
            "usedDataIntegrationUnits": 4,
            "usedParallelCopies": 1,
            "detailedDurations": {
                "queuingDuration": 3,
                "preCopyScriptDuration": 0,
                "timeToFirstByte": 0,
                "transferDuration": 1
            }
        }
    ]
}

我为If Condition活动构建了这样的表达式:

@and(equals(activity('Copy_Activity1').output.executionDetails[3],'Succeeded'), equals(activity('Copy_Activity2').output.executionDetails[3],'Succeeded'))

但是他给我以下错误:

"error": {
    "code": "InvalidTemplate",
    "message": "Unable to process template language expressions in action 'If Condition1' inputs at line '1' and column '1294': 'The template language expression 'and(equals(activity('Copy_Item_Budget_Name').output.executionDetails[3],'Succeeded'), equals(activity('Copy_Item_Budget_Entry').output.executionDetails[3],'Succeeded'))' cannot be evaluated because array index '3' is outside bounds (0, 0) of array. Please see https://aka.ms/logicexpressions for usage details.'."
}

但是即使有了指南,我也无法解决问题。

有人知道如何解决问题吗?谢谢

3 个答案:

答案 0 :(得分:2)

从输出数据来看,executionDetails是一个只有一个包含对象的项目的数组。因此表达式应为:activity('Copy_Activity1').output.executionDetails[0].status

答案 1 :(得分:0)

如果您的要求是在所有复制活动成功完成后运行某些活动,那么Johns-305的答案实际上是正确的。

这是带有更多详细信息的示例。复制活动为activity 1activity 2,其他活动将在activity 3activity 4之后运行,activity 3activity 4之间没有依赖关系。活动应链接如下图。请注意,activity 3activity 4不会运行两次,只有在activity 1activity 2中的两者都运行之后,它们才会运行成功了。 Activity graph of the example

答案 2 :(得分:-1)

为清楚起见,这不是ADF中流量控制的工作原理。

您无需查询先前形状的结果,而是将Activity Connector更改为根据结果进行分支。

连接两个活动后,右键单击行/箭头。然后,您可以选择对成功,失败,完成或跳过中的任何一个运行下一个活动。

您可以在之前和之后链接任意数量的活动。