我想创建一个ADF v2管道,该管道在Azure SQL数据仓库中调用存储过程。存储过程有两个参数,其中一个是输出参数。存储过程加载临时表。然后,将加载到登台表中的记录数分配给输出参数。
有没有办法在我的管道中稍后使用输出参数的值?
在SSIS中,我会使用行计数转换将值分配给参数,然后在同一个包中访问该参数。
答案 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来调用存储过程是很好的。
要解决这个问题,我会对感兴趣的每个项目执行以下操作:
还要注意:Lookup Activity不是使用输出参数,而是存储过程的返回值。此返回值可以是多个行和列。如果只希望第一行,则查找活动具有仅第一行复选框。所有数据均以json的形式从Lookup Activity返回。多行作为json数组返回。