XML 针对 Azure SQL Azure 数据工厂中的服务器的文件验证
XML File Validation Against Azure SQL Server in Azure Data Factory
我的 XML 文件(位于 Azure Blob 容器中)
<?xml version="1.0" encoding="utf-8"?>
<Details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Person>
<id>2</id>
<name>XXX</name>
<age>12</age>
</Person>
</Details>
我的 Azure SQL 服务器 Table
Table 名称: 用户表
ID | NAME | AGE | GENDER
1 | JAY | 12 | MALE
2 | XXX | 11 | MALE
我想将来自 XML 的文件与 Above Azure SQL 服务器 (UserTABLE) 进行比较,如果匹配,那么我想 更新 其他字段从 XML 文件到我的用户 Table,如果没有,那么我想 作为新行插入 Azure SQL 服务器,所有给定字段值从 XML 到我的用户 Table
任何人都可以建议我如何继续吗?
您可以使用分段 table,您将在其中 truncate/load xml 数据,然后从同一 ADF 调用存储过程以根据此分段执行 Insert/Update暂存中的数据 table。在下一个 运行 期间,它将 t运行 匹配 table 然后再次执行相同的过程。所有这些都可以通过您现有的 ADF 完成。
Azure SQL 数据库最近获得了使用 BULK INSERT 或 OPENROWSET 从 Azure Blob 存储加载文件的能力。开始 here.
使用您的示例代码和数据,您可以导入 xml,将其切碎,然后使用 MERGE
到 INSERT/UPDATE
将其放入主 table。一个简单的演示:
DROP TABLE staging
DROP TABLE #tmp
DROP TABLE yourTable
CREATE TABLE staging ( rowId INT IDENTITY PRIMARY KEY, yourXML XML );
CREATE TABLE #tmp ( id INT PRIMARY KEY, name VARCHAR(30) NOT NULL, age INT NOT NULL );
SELECT * INTO yourTable FROM #tmp
INSERT INTO staging
SELECT *
FROM OPENROWSET(
BULK 'archive/temp.xml',
DATA_SOURCE = 'MyAzureBlobStorageAccount',
SINGLE_BLOB
) AS x
INSERT INTO #tmp ( id, name, age )
SELECT
x.c.value('(id/text())[1]', 'int' ) AS id,
x.c.value('(name/text())[1]', 'varchar(30)' ) AS name,
x.c.value('(age/text())[1]', 'int' ) AS age
FROM staging s
CROSS APPLY s.yourXML.nodes('Details/Person') AS x(c)
-- Merge
MERGE INTO dbo.yourTable t
USING
(
SELECT * FROM #tmp
) s ON t.id = s.id
-- Insert new records ( no match on primary key )
WHEN NOT MATCHED BY TARGET
THEN
INSERT ( id, name, age )
VALUES ( id, name, age )
WHEN MATCHED
AND t.name != s.name
OR t.age != s.age
-- Update existing ( no match on primary key )
THEN UPDATE
SET
t.name = s.name,
t.age = s.age;
SELECT *
FROM dbo.yourTable
您最好暂时忘掉数据工厂。编写一个 SQL 脚本,成功完成上述设置并成功运行。当您完成该工作后,将其转换为存储过程。测试它。当您完成这项工作后,您就可以开始考虑数据工厂了。您将需要一个输出数据集,但不需要输入数据集。完成教程 here.
我的 XML 文件(位于 Azure Blob 容器中)
<?xml version="1.0" encoding="utf-8"?>
<Details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Person>
<id>2</id>
<name>XXX</name>
<age>12</age>
</Person>
</Details>
我的 Azure SQL 服务器 Table
Table 名称: 用户表
ID | NAME | AGE | GENDER
1 | JAY | 12 | MALE
2 | XXX | 11 | MALE
我想将来自 XML 的文件与 Above Azure SQL 服务器 (UserTABLE) 进行比较,如果匹配,那么我想 更新 其他字段从 XML 文件到我的用户 Table,如果没有,那么我想 作为新行插入 Azure SQL 服务器,所有给定字段值从 XML 到我的用户 Table
任何人都可以建议我如何继续吗?
您可以使用分段 table,您将在其中 truncate/load xml 数据,然后从同一 ADF 调用存储过程以根据此分段执行 Insert/Update暂存中的数据 table。在下一个 运行 期间,它将 t运行 匹配 table 然后再次执行相同的过程。所有这些都可以通过您现有的 ADF 完成。
Azure SQL 数据库最近获得了使用 BULK INSERT 或 OPENROWSET 从 Azure Blob 存储加载文件的能力。开始 here.
使用您的示例代码和数据,您可以导入 xml,将其切碎,然后使用 MERGE
到 INSERT/UPDATE
将其放入主 table。一个简单的演示:
DROP TABLE staging
DROP TABLE #tmp
DROP TABLE yourTable
CREATE TABLE staging ( rowId INT IDENTITY PRIMARY KEY, yourXML XML );
CREATE TABLE #tmp ( id INT PRIMARY KEY, name VARCHAR(30) NOT NULL, age INT NOT NULL );
SELECT * INTO yourTable FROM #tmp
INSERT INTO staging
SELECT *
FROM OPENROWSET(
BULK 'archive/temp.xml',
DATA_SOURCE = 'MyAzureBlobStorageAccount',
SINGLE_BLOB
) AS x
INSERT INTO #tmp ( id, name, age )
SELECT
x.c.value('(id/text())[1]', 'int' ) AS id,
x.c.value('(name/text())[1]', 'varchar(30)' ) AS name,
x.c.value('(age/text())[1]', 'int' ) AS age
FROM staging s
CROSS APPLY s.yourXML.nodes('Details/Person') AS x(c)
-- Merge
MERGE INTO dbo.yourTable t
USING
(
SELECT * FROM #tmp
) s ON t.id = s.id
-- Insert new records ( no match on primary key )
WHEN NOT MATCHED BY TARGET
THEN
INSERT ( id, name, age )
VALUES ( id, name, age )
WHEN MATCHED
AND t.name != s.name
OR t.age != s.age
-- Update existing ( no match on primary key )
THEN UPDATE
SET
t.name = s.name,
t.age = s.age;
SELECT *
FROM dbo.yourTable
您最好暂时忘掉数据工厂。编写一个 SQL 脚本,成功完成上述设置并成功运行。当您完成该工作后,将其转换为存储过程。测试它。当您完成这项工作后,您就可以开始考虑数据工厂了。您将需要一个输出数据集,但不需要输入数据集。完成教程 here.