使用数据工厂v2 USQL活动将动态参数传递给USQL脚本

时间:2018-03-15 15:08:08

标签: azure-data-factory u-sql

USQL

我在USQL数据库中定义了多个存储过程,并带有以下签名。

  • MyDatabase.dbo.DoThing01(@ticketNumber int)
  • MyDatabase.dbo.DoThing02(@ticketNumber int)
  • MyDatabase.dbo.DoThing03(@ticketNumber int)

当我手动从门户网站中的azure分析作业UI调用它们时,这些存储过程会起作用。

  

我有数据工厂v2管道设置,其中一个USQL活动调用位于azure datalake商店的脚本文件,该文件试图将参数值传递为@ticketNumber

我尝试了什么

Datafactory活动

                      "typeProperties": {
                            "scriptPath": "Script.txt",
                            "degreeOfParallelism": 10,
                            "scriptLinkedService": {
                                "referenceName": "CampuslabsDatalakeStore",
                                "type": "LinkedServiceReference"
                            },
                            "parameters": {
                                "ticketNumber": "@item().InstitutionId"
                            }
                        }                           

场景1:USQL脚本

DECLARE @ticketNumber int = -1;

MyDatabase.dbo.DoThing01(@ticketNumber);
MyDatabase.dbo.DoThing02(@ticketNumber);
MyDatabase.dbo.DoThing03(@ticketNumber);

错误:脚本以默认值-1执行。

场景2:USQL脚本

DECLARE @ticketNumber int;

MyDatabase.dbo.DoThing01(@ticketNumber);
MyDatabase.dbo.DoThing02(@ticketNumber);
MyDatabase.dbo.DoThing03(@ticketNumber);

错误:我收到一个编译错误,声明变量是错误的。

场景3:USQL脚本

MyDatabase.dbo.DoThing01(@ticketNumber);
MyDatabase.dbo.DoThing02(@ticketNumber);
MyDatabase.dbo.DoThing03(@ticketNumber);

错误:我收到一个未定义变量的编译错误。

  

我的问题是:如何将动态值参数从v2 USQL活动传递给USQL脚本

1 个答案:

答案 0 :(得分:2)

将参数从ADF传递到U-SQL脚本时,应使用DECLARE EXTERNAL在脚本中声明参数的默认值。 ADF v2通过在脚本的最顶层写入DECLARE语句将参数传递给U-SQL。但是,同一个变量的多个DECLARE语句会导致编译错误 - 但是使用DECLARE EXTERNAL和DECLARE语句不会导致错误,因为DECLARE EXTERNAL的用例将被上面的DECLARE语句覆盖(对于这个用例)。

U-SQL要求变量在定义时具有值,这是您的Scenario 2错误。

因为场景1使用脚本中声明的值运行,而场景3没有编译意味着您的变量根本没有传入,即使您的JSON脚本看起来正确。我的预感是动态参数定义中的错误。你从哪里通过InstitutionId?如果它是为整个管道定义的参数,则该值应为" @Pipeline()。parameters.InstitutionId"。如果可能的话,看看你的整个ADF管道会很有用(或至少在你获得item()的地方。)InstituionId from)。