首页 > 解决方案 > 使用 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

标签: azureazure-sql-databaseazure-data-factory

解决方案


2020 年 7 月更新

最近向复制活动添加了一项新功能,允许您添加列,$$FILEPATH这是目前唯一受支持的变量。请参阅此处了解更多详细信息:

https://docs.microsoft.com/en-us/azure/data-factory/copy-activity-overview#add-additional-columns-during-copy


原始答案

向数据集添加额外的列可能会被视为转换,并且 Azure 数据工厂 v2 (ADF v2) 复制任务本身并不适合转换。它可以做一些事情,比如从一种格式(例如 csv)转换为其他格式(例如 JSON),但它是有限的。也许在未来的某个时候,他们会在映射中添加一些东西,允许添加字符串文字或类似于 SSIS 派生列功能的东西,但这些类型的功能目前正在被添加到映射数据流中。

但是,实现此目的的一种方法是使用存储过程目标,其中包含文件名参数和主数据集的表类型参数。它看起来有点像这样: 具有存储过程目标的 ADF 复制任务

缺点是您现在必须在数据库 ( 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 任务中,如下图所示:

ADF 逻辑图


推荐阅读