如何使用 Azure 数据工厂从 SQL 服务器读取 XML 列数据
How to read XML column data from SQL server using Azure data Factory
Azure SQL 服务器中有一个 table 并且 table 有一个字段调用 request 是 xml 数据类型。我们正在读取 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.
我的结果:
Azure SQL 服务器中有一个 table 并且 table 有一个字段调用 request 是 xml 数据类型。我们正在读取 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.
我的结果: