Azure Data Factory V2 - 使用输出参数调用存储过程

时间:2017-10-27 04:01:54

标签: azure-data-factory

我想创建一个ADF v2管道,该管道在Azure SQL数据仓库中调用存储过程。存储过程有两个参数,其中一个是输出参数。存储过程加载临时表。然后,将加载到登台表中的记录数分配给输出参数。

有没有办法在我的管道中稍后使用输出参数的值?

在SSIS中,我会使用行计数转换将值分配给参数,然后在同一个包中访问该参数。

3 个答案:

答案 0 :(得分:0)

在ADF v1中,您可以使用 CopyActivity ,其中 sqlReaderQuery 查询将为"$$Text.Format('exec MyStproc \\'{1:yyyy-MM-dd HH:mm}\\' ', WindowStart, WindowEnd),其中MyStproc将类似于:

create procedure MyStproc (@inputParam date)
as
select *
from aTable
where bField=@inputParam

然后,您可以将输出存储为 JSON ,并根据需要使用查找活动。 我很确定你也可以采用这种方法来实现v2。

答案 1 :(得分:0)

工作量: 作为实现此功能的解决方法,我们可以使用“查找活动”作为替代方案。这样我们就可以执行存储过程,并可以灵活地捕获输出,如下所示。 注意:如果要从storedproc捕获的输出是单行而不是多行,则此解决方案/解决方案很有用。具有输出参数的查找活动:

{
    "name": "Test_Lookup",
    "type": "Lookup",
    "policy": {
        "timeout": "7.00:00:00",
        "retry": 0,
        "retryIntervalInSeconds": 30,
        "secureOutput": false
    },
    "typeProperties": {
        "source": {
            "type": "SqlSource",
            "sqlReaderStoredProcedureName": "[dbo].[sp_testproc]",
            "storedProcedureParameters": {
                "TEST": {
                    "type": "Int32",
                    "value": "1"
                }
            }
        },
        "dataset": {
            "referenceName": "AzureDBDataset",
            "type": "DatasetReference"
        }
    }
}

Lookup Activity without output parameter
{
    "name": "Test_Lookup",
    "type": "Lookup",
    "policy": {
        "timeout": "7.00:00:00",
        "retry": 0,
        "retryIntervalInSeconds": 30,
        "secureOutput": false
    },
    "typeProperties": {
        "source": {
            "type": "SqlSource",
            "sqlReaderStoredProcedureName": "[dbo].[sp_testproc]"
        },
        "dataset": {
            "referenceName": "AzureDBDataset",
            "type": "DatasetReference"
        }
    }
}

现在让我们在动态内容中使用以下代码来访问已创建的存储过程的输出值

动态表达-@activity('Test_Lookup').output.firstRow.TEST Azure数据工厂http://naveensql23.blogspot.com/2018/07/stored-procedures-with-output.html

中带有输出参数的存储过程

答案 2 :(得分:0)

简而言之,您不能这样做。 ADFv2存储过程活动不支持输出参数。我还没有找到可以请求功能更新的地方,但这是非常必要的功能。

相反,您必须使用Naveen建议的解决方法。当您只有一个要返回的项目时,Naveen建议调用Lookup Activity来调用存储过程是很好的。

要解决这个问题,我会对感兴趣的每个项目执行以下操作:

  1. 将上一步中的管道ID和json输入发送给原始存储过程活动。
  2. 记录管道ID和您要返回的任何其他数据。
  3. 调用传递管道ID作为查找键的Lookup Activity,以获取您在步骤2中所需的数据。注:您还必须发送另一个参数。对我来说,它是文件名,以查看是否应继续处理该文件。

还要注意:Lookup Activity不是使用输出参数,而是存储过程的返回值。此返回值可以是多个行和列。如果只希望第一行,则查找活动具有仅第一行复选框。所有数据均以json的形式从Lookup Activity返回。多行作为json数组返回。