2017-06-01 83 views
1

我的XML文件(位于Azure中的Blob容器)XML文件验证针对Azure的SQL Server中的Azure的数据工厂

<?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 Server表

表名:用户表

ID | NAME | AGE | GENDER  
1 | JAY | 12 | MALE 
2 | XXX | 11 | MALE 

我想comp是从针对上述Azure的SQL服务器(用户表)的XML文件,如果匹配的话,我想更新从XML文件等领域到我的用户表,如果不是的话,我想插入作为新行 Azure SQL Server的所有给定字段值从XML到我的用户表

任何人都可以请建议我如何进行?

回答

0

Azure SQL数据库最近获得了使用BULK INSERT或OPENROWSET从Azure Blob存储加载文件的功能。开始here

以您的示例代码和数据为例,您可以导入xml,将其切碎,然后使用MERGEINSERT/UPDATE将它加入到主表中。一个简单的演示:

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

+0

我可以在StoreProcedure中使用您的答案吗?.I是指我的Datafactory包含输入数据集作为** Blob存储**在XML数据所在的位置,则我的存储过程活动作为**管道**包含您的代码,将在我的表中插入和更新。 – Jayendran

+0

是的,我想你可以简化成一个单一的存储过程,而完成所有的工作,不需要任何XML数据集这一点。 – wBob

+0

哦,无需输入数据集!我在想每个管道都必须包含一个输入/输出数据集。如你所说,我的解决方案不需要数据集(输入/输出)?单个StroeProc管道足够没有任何数据集? – Jayendran

2

你可以使用一个临时表,你会截断/加载XML数据,然后调用存储过程从相同的ADF根据您在临时表中该暂存数据做插入/更新。在下次运行时,它将截断表格,然后再次执行相同的过程。所有这些都可以通过现有的ADF完成。