Azure SQL数据库最近获得了使用BULK INSERT或OPENROWSET从Azure Blob存储加载文件的功能。开始here。
以您的示例代码和数据为例,您可以导入xml,将其切碎,然后使用MERGE
至INSERT/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。
我可以在StoreProcedure中使用您的答案吗?.I是指我的Datafactory包含输入数据集作为** Blob存储**在XML数据所在的位置,则我的存储过程活动作为**管道**包含您的代码,将在我的表中插入和更新。 – Jayendran
是的,我想你可以简化成一个单一的存储过程,而完成所有的工作,不需要任何XML数据集这一点。 – wBob
哦,无需输入数据集!我在想每个管道都必须包含一个输入/输出数据集。如你所说,我的解决方案不需要数据集(输入/输出)?单个StroeProc管道足够没有任何数据集? – Jayendran