将新列添加到 Azure 数据工厂中的 table

Adding new columns to a table in Azure Data Factory

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

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

我正在尝试在数据工厂中读取此文件并循环遍历列名并检查目标 table 如果这些列已经存在,否则我想在 [=21] 中创建缺失的列=] table.

我知道我们可以使用以下 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 查询。请问有什么建议吗?

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

• Table 列 在执行管道之前

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

源文件:

ADF 管道:

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

查询输出activity:

  1. lookup 输出连接到 ForEach activity 以循环查找中的所有值。

@activity('Lookup1').output.value

  1. ForEach activity 中添加 Copy data activity 并将 source 连接到 SQL table。 Select query 而不是使用查询属性中的 table。编写一个不会产生任何结果的查询,因为我们使用此副本 activity 只是为了向 table 添加一列(如果不存在)。

select * from dbo.contact_info where 1= 2

  1. Copy dataactivitysink中,将sink数据集连接到SQLtable ,并在 预复制脚本 中编写您的查询以添加新列。这里使用当前的 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')}
    

  1. 执行管道时,FoEach 循环执行直到它完成查找输出中的所有值并在 table 中创建一个新列(如果不存在)。

管道执行后table中的列: