azure - 使用 ADF,如何将文件名加载到 SQL Server 表中?
问题描述
我正在尝试一起使用 GetMetadata 活动和 CopyData 活动。我的设置看起来像这样。
我正在尝试获取文件名(使用 GetMetadata)并将它们加载到 SQL Server 表中的字段中(与 CopyData 一起)。CopyData 工作得很好,但我看不出有任何方法可以让 GetMetadata 获取文件名并将它们传递到表中的字段中。在我的示例中,源数据中有 4 个字段与目标表中的 4 个字段匹配。第 5 个字段大概是文件名。显然,它并不像这样工作。我通读了下面的文档,但仍然无法弄清楚。
https://docs.microsoft.com/en-us/azure/data-factory/control-flow-get-metadata-activity
解决方案
2020 年 7 月更新
最近向复制活动添加了一项新功能,允许您添加列,$$FILEPATH
这是目前唯一受支持的变量。请参阅此处了解更多详细信息:
原始答案
向数据集添加额外的列可能会被视为转换,并且 Azure 数据工厂 v2 (ADF v2) 复制任务本身并不适合转换。它可以做一些事情,比如从一种格式(例如 csv)转换为其他格式(例如 JSON),但它是有限的。也许在未来的某个时候,他们会在映射中添加一些东西,允许添加字符串文字或类似于 SSIS 派生列功能的东西,但这些类型的功能目前正在被添加到映射数据流中。
但是,实现此目的的一种方法是使用存储过程目标,其中包含文件名参数和主数据集的表类型参数。它看起来有点像这样:
缺点是您现在必须在数据库 ( CREATE TYPE
) 中创建一个支持表类型并创建一个存储过程来处理它,如下所示:
CREATE TYPE dbo.typ_multiFile AS TABLE (
col1 CHAR(1) NOT NULL,
col2 CHAR(1) NOT NULL,
col3 CHAR(1) NOT NULL
)
GO
CREATE OR ALTER PROC dbo.usp_ins_myTable (
@fileName AS VARCHAR (100),
@typ AS dbo.typ_multiFile READONLY
)
AS
SET NOCOUNT ON
INSERT INTO dbo.myTable ( [fileName], col1, col2, col3 )
SELECT @fileName, col1, col2, col3
FROM @typ
RETURN
GO
请注意,复制任务位于 ForEach 任务中,如下图所示: