向 Azure 数据工厂中的表添加新列

Posted

技术标签:

【中文标题】向 Azure 数据工厂中的表添加新列【英文标题】:Adding new columns to a table in Azure Data Factory 【发布时间】:2021-12-31 02:41:35 【问题描述】:

我在 blob 存储中有一个 CSV 文件,格式如下:

**Column,DataType**
Acc_ID, int
firstname, nvarchar(500)
lastname, nvarchar(500)

我正在尝试在数据工厂中读取此文件并遍历列名并检查目标表是否已存在这些列,否则我想在 SQL 表中创建缺失的列。

我知道我们可以使用以下 SQL 查询来创建不存在的列。

IF NOT EXISTS (
  SELECT
    *
  FROM
    INFORMATION_SCHEMA.COLUMNS
  WHERE
    TABLE_NAME = 'contact_info' AND COLUMN_NAME = 'acc_id')
BEGIN
  ALTER TABLE contact_info
    ADD acc_id int NULL
END;

但我不确定我们是否可以读取 CSV 文件并将列名从 CSV 文件传递​​到数据工厂管道中的上述 SQL 查询。请问有什么建议吗?

【问题讨论】:

additional column during copy 是您要找的吗? 【参考方案1】:

如果不存在列,您可以使用 Copy data 活动中的预复制脚本创建列。

• 表列在执行管道之前

SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'contact_info'

源文件:

ADF 管道:

    使用lookup 活动,通过将源数据集连接到源文件来获取列表列和数据类型。

查找活动的输出

    lookup 输出连接到ForEach 活动以循环查找中的所有值。

@activity('Lookup1').output.value

    ForEach 活动中添加Copy data 活动并将 连接到SQL 表。在使用查询属性中选择 query 而不是表。编写一个不会产生任何结果的查询,因为我们使用此复制活动只是将一列添加到表中(如果不存在)。

select * from dbo.contact_info where 1= 2

    Copy data 活动sink 中,将sink 数据集连接到SQL 表,然后在预复制脚本 中编写查询以添加新列。此处使用当前的ForEach 循环项(列、数据类型)值,而不是硬编码如下值。

    @concat('IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ','''','contact_info','''',' AND COLUMN_NAME = ','''',item().Column,'''',') ALTER TABLE contact_info ADD ',item().Column,' ', item().DataType,' NULL')
    

    当管道执行时,FoEach 循环会一直执行,直到它完成查找输出中的所有值,如果不存在则在表中创建一个新列。

表中的列管道执行后

【讨论】:

这很有帮助!效果很好!

以上是关于向 Azure 数据工厂中的表添加新列的主要内容,如果未能解决你的问题,请参考以下文章

向 BigQuery 中的历史表添加新字段

向数据框中的新列添加值

Azure 数据工厂 - 尝试将参数添加到 REST API 请求正文中的动态内容

将新列添加到现有表中并使用 PL/SQL 中游标中的值更新它们

向具有许多记录的表添加主键

R中向具有大量数据集的数据框添加新列的有效方法