在您描述的当前情况下,您将无法获得确切的文件名。 ADF 不是数据转换服务,因此无法为您提供这种级别的功能......我希望它有!
但是,有几个选项可以获取文件名或类似使用的名称。 我接受的都不是完美的!
选项 1(我认为最好的选项!)
如你所愿。将参数传递给 SQL DB 存储过程。这当然可以使用 ADF 活动参数属性来实现。
作为参数传递什么?...
好吧,如果您在 blob 存储中的源文件在文件名中有明确定义的日期和时间。这是您在输入数据集定义中已经使用的内容,然后将其传递给 proc。将其存储在 SQL DB 表中。然后您可以计算出文件何时加载、何时加载以及重叠时间。也许?
您可以访问活动中数据集的时间片开始。示例 JSON...
"activities": [
{
"name": "StoredProcedureActivityTemplate",
"type": "SqlServerStoredProcedure",
"inputs": [
{
"name": "BlobFile"
}
],
"outputs": [
{
"name": "RelationalTable"
}
],
"typeProperties": {
"storedProcedureName": "[dbo].[usp_LoadMyBlobs]",
"storedProcedureParameters": {
//like this:
"ExactParamName": "$$Text.Format('{0:yyyyMMdd}', Time.AddMinutes(SliceStart, 0))" //tweak the date format
}
}, //etc ....
选项 2(努力工作)
为自己创建一个读取文件的中间人 ADF 自定义活动,加上文件名并将值添加为列。
ADF 中的自定义活动基本上让您可以做任何事情,因为您必须在 C# 中制作数据转换行为。
如果您想走这条路,我建议您了解使用自定义活动所涉及的内容。需要更多的努力和 Azure Batch 服务。
选项 3(完全矫枉过正)
使用 Azure 数据湖分析服务!采用与选项 2 相同的方法。在数据湖中使用 USQL 解析文件并将文件名包含在输出数据集中。在 USQL 中,您可以将文件名的通配符作为提取器的一部分传递并在输出数据集中使用它。
我将此选项标记为矫枉过正,因为仅仅为了读取文件名而使用完整的数据湖服务是多余的。实际上,数据湖可能会取代您的 SQL DB 层并免费为您提供文件名转换。
顺便说一句,您不需要使用 Azure Data Lake 存储来存储源文件。您可以授予分析服务对现有共享 blob 存储帐户的访问权限。但您只需要它来支持分析服务。
选项 4
重新考虑并使用 Azure Data Lake 代替 Azure SQL DB?????
希望对你有帮助