【问题标题】:Azure Data Factory V2 - Calling a stored procedure with an output parameterAzure 数据工厂 V2 - 使用输出参数调用存储过程
【发布时间】:2018-04-08 14:28:45
【问题描述】:

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

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

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

【问题讨论】:

  • 我也在找同样的...
  • 我也有类似的问题。如果您有任何提示 - 请分享。

标签: azure-data-factory


【解决方案1】:

解决方法: 作为实现此功能的解决方法,我们可以使用 Lookup Activity 作为替代方案。我们可以执行存储过程——以及捕获输出的灵活性,如下所示。 注意:如果要从 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】:

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

    相反,您必须使用 Naveen 建议的解决方法。当您只有一个要返回的项目时,Naveen 关于调用查找活动来调用存储过程的建议非常棒。

    为了解决这个问题,我正在对我感兴趣的每个项目执行以下操作:

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

    另外需要注意的是:Lookup Activity 使用的不是输出参数,而是存储过程的返回值。这个返回值可以是多行多列。如果您只想要第一行,则查找 Activity 有一个 First Row Only 复选框。所有数据都以 json 格式从 Lookup Activity 返回。多行作为 json 数组返回。

    【讨论】:

      【解决方案3】:

      在 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 并根据需要将其用于 Lookup 活动。 我很确定您也可以在 v2 中采用这种方法。

      【讨论】:

        猜你喜欢
        • 2020-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-25
        • 2020-03-06
        相关资源
        最近更新 更多