【问题标题】:pipeline fails for stored Procedure called in Copy Activity - Azure data factory V2复制活动中调用的存储过程的管道失败 - Azure 数据工厂 V2
【发布时间】:2019-04-23 23:50:45
【问题描述】:

我们有一个返回增量记录的 SQL 服务器存储过程。如果表没有更改,则不返回任何内容。存储过程执行预期的操作。

我们通过 Azure 数据工厂中的复制活动调用上述存储过程。它适用于所有情况,除非没有返回任何内容(空)。

我们正在寻找一个选项,其中从存储过程返回 Nothing(Empty),管道应该跳过并继续进行,并将整个管道标记为成功而不是失败。

谢谢

【问题讨论】:

  • 我建议首先使用 Lookup 活动返回 SP 的输出,然后使用 IF 活动检查该输出是否为空,如果它不为空,则执行复制活动。
  • 我不能使用 IFCondition 活动,因为我已经使用过一次。我相信,IFCondition 活动只能在管道中使用一次:)
  • 您不能将另一个 IF 作为内部活动,但您可以检查第一个 IF 的流输出,并检查第一个 IF 的输出是真还是假(您需要什么)和在那里你可以进入内心活动和SP。 :)

标签: azure azure-data-factory


【解决方案1】:

您的存储过程需要以 SELECT 结尾,因此它会返回一些内容 - 如果没有要返回的行,则包括一个空集。

但是,如果没有行,要跳过管道,DraganB 的最后一个答案非常相关,我必须在我当前的项目中这样做几次。

【讨论】:

  • 我同意。但就我而言,当存储过程没有返回输出时,我需要创建一个空文件。仅包含标题记录的空文件(第一行作为列名)。我正在寻找类似的东西 - link
【解决方案2】:

正如@DraganB在评论中所说,活动可以在流中运行,所以你可以做stored procedure activity --> if activity --> copy activity。如果sp活动的输出为空,则不要运行复制活动并结束管道。

另一个想法,也许你可以了解一下 azure function external table trigger。您可以在表中添加一个状态列,例如needToBeCopied,每次插入或更新操作都会更改该列。然后在运行复制活动时过滤需要复制的数据。

【讨论】:

    【解决方案3】:

    解决了。真正的问题是复制活动没有返回正确的错误消息。访问控制存在问题。

    Grant VIEW CHANGE TRACKING permission on a table to a user:
    [sql]
    GRANT VIEW CHANGE TRACKING ON OBJECT::dbo.databaselog to username
    [/sql]
    

    增量加载方法是通过在 SQL Server 数据库和所需表上启用更改跟踪。 Azure 数据工厂应将错误记录为“某某表权限不足”。相反,它使整个管道失败并显示错误消息,因为“存储过程可能无效或存储过程不返回任何输出”。

    无论如何,我们分配了正确的权限并且问题得到了解决。现在,当存储过程没有返回任何输出时,它会创建一个仅包含标头记录的空文件 - Data Factory Avoiding creation of empty files

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 2019-10-24
      • 1970-01-01
      • 2017-09-02
      • 2018-10-02
      • 1970-01-01
      相关资源
      最近更新 更多