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

passing dynamic parameter to USQL script using data factory v2 USQL activity

USQL

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

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

I have data factory v2 pipeline setup, with an USQL activity that calls a script file located on azure datalake store which tries to pass a parameter value as @ticketNumber

我试过的

数据工厂Activity

                      "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);

错误:我收到编译错误,未定义变量。

My question is : How do you pass a dynamic value parameter to the USQL script from a v2 USQL activity

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

U-SQL要求变量在定义的时候有值,就是你的场景2错误。

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