将新列添加到 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 管道:
- 使用
lookup
activity,通过将源数据集连接到源文件来获取列表列和数据类型。
查询输出activity:
- 将
lookup
输出连接到 ForEach
activity 以循环查找中的所有值。
@activity('Lookup1').output.value
- 在
ForEach
activity 中添加 Copy data
activity 并将 source 连接到 SQL table。 Select query 而不是使用查询属性中的 table。编写一个不会产生任何结果的查询,因为我们使用此副本 activity 只是为了向 table 添加一列(如果不存在)。
select * from dbo.contact_info where 1= 2
在Copy data
activitysink中,将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')}
- 执行管道时,FoEach 循环执行直到它完成查找输出中的所有值并在 table 中创建一个新列(如果不存在)。
管道执行后table中的列:
我在 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 管道:
- 使用
lookup
activity,通过将源数据集连接到源文件来获取列表列和数据类型。
查询输出activity:
- 将
lookup
输出连接到ForEach
activity 以循环查找中的所有值。
@activity('Lookup1').output.value
- 在
ForEach
activity 中添加Copy data
activity 并将 source 连接到 SQL table。 Select query 而不是使用查询属性中的 table。编写一个不会产生任何结果的查询,因为我们使用此副本 activity 只是为了向 table 添加一列(如果不存在)。
select * from dbo.contact_info where 1= 2
在
Copy data
activitysink中,将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')}
- 执行管道时,FoEach 循环执行直到它完成查找输出中的所有值并在 table 中创建一个新列(如果不存在)。
管道执行后table中的列: