向 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 数据工厂中的表添加新列的主要内容,如果未能解决你的问题,请参考以下文章
Azure 数据工厂 - 尝试将参数添加到 REST API 请求正文中的动态内容