如何使用 Azure 数据工厂从 SQL 服务器读取 XML 列数据

How to read XML column data from SQL server using Azure data Factory

Azure SQL 服务器中有一个 table 并且 table 有一个字段调用 requestxml 数据类型。我们正在读取 Azure 数据工厂中的 table,因此当我们在 Azure 数据工厂中创建数据集时,它会以 XML 的形式出现,但在将该数据集用作数据流中的来源它以 string.

的形式出现

谁能告诉我们如何解析 Azure 数据工厂中的 XML 列数据。提前致谢。

我们想从 XML 数据列中获取信息,并在对其执行聚合后将其转储到 Azure SQL 服务器中的另一个 table。

这是 table 的示例数据。

Azure 数据工厂 (ADF) 对 XML 没有很好的支持,但 Azure SQL DB 支持。由于您的源和目标相同,您可以创建一个存储过程来分解 XML。如果需要调度 activity.

然后使用 ADF 的 Stored Proc activity 调用它

这是在 Azure SQL DB 中粉碎 XML 的简单示例:

------------------------------------------------------------------------------------------------
-- Setup START
------------------------------------------------------------------------------------------------

DROP TABLE IF EXISTS dbo.students 
DROP TABLE IF EXISTS dbo.yourTarget
GO

CREATE TABLE dbo.students (
    studentId       INT NOT NULL PRIMARY KEY,
    studentName     VARCHAR(20) NOT NULL,
    request         XML NOT NULL
    )
GO


CREATE TABLE dbo.yourTarget (
    studentId       INT NOT NULL,
    customerno      INT NOT NULL,
    operation       VARCHAR(20) NOT NULL,
    email           VARCHAR(100) NOT NULL
    )
GO

-- Setup END
------------------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------------
-- Test data START
------------------------------------------------------------------------------------------------

INSERT INTO dbo.students ( studentId, studentName, request )
VALUES 
    ( 1, 'xxx', '<Customers><row><CUSTOMERNO>12</CUSTOMERNO><OPERATION>INSERT</OPERATION><EMAIL>bill.gates@microsoft.com</EMAIL></row></Customers>' ),
    ( 2, 'yyy', '<Customers><row><CUSTOMERNO>13</CUSTOMERNO><OPERATION>INSERT</OPERATION><EMAIL>bill.gates@microsoft.com</EMAIL></row></Customers>' ),
    ( 3, 'zzz', '<Customers><row><CUSTOMERNO>14</CUSTOMERNO><OPERATION>INSERT</OPERATION><EMAIL>bill.gates@microsoft.com</EMAIL></row></Customers>' ),
    ( 4, 'xyz', '<Customers><row><CUSTOMERNO>100</CUSTOMERNO><OPERATION>INSERT</OPERATION><EMAIL>bill.gates@microsoft.com</EMAIL></row></Customers>' )
GO

-- Test data END
------------------------------------------------------------------------------------------------


------------------------------------------------------------------------------------------------
-- Shred XML START
------------------------------------------------------------------------------------------------

INSERT INTO dbo.yourTarget ( studentId, customerno, operation, email )
SELECT
    s.studentId,
    c.c.value( '(CUSTOMERNO/text())[1]', 'INT' ) customerno,
    c.c.value( '(OPERATION/text())[1]', 'VARCHAR(20)' ) operation,
    c.c.value( '(EMAIL/text())[1]', 'VARCHAR(100)' ) email  
FROM dbo.students s
    CROSS APPLY s.request.nodes('Customers/row') c(c)

-- Shred XML END
------------------------------------------------------------------------------------------------

GO


-- Results
SELECT *
FROM dbo.yourTarget

将您的逻辑包装到存储过程中以进行调度。如果您的数据库位于不同的服务器上,您仍然可以使用 T-SQL 来粉碎数据集中的 XML,这样您就可以向 ADF 提供列而不是 XML.

我的结果: