Azure Synapse管道将xml数据解析为行集

ffx8fchx  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(95)

在Azure Synapse管道中,我调整了从临时表到Azure Synapse SQL专用池上DWH的加载。我有一个源表,其中一列的xml数据以文本形式存储在该列中(nvarchar(max))。我需要从列和行集中的每一行解析此xml,并加载到Azure Synapse SQL专用池中。xml函数在此处不适用,因为Azure Synapse不支持xml。
表是这样的:
source table
我需要这样的结果表:
needed result set
或类似:
needed result set another
我尝试使用Azure Synapse管道数据流解析转换,但对于第三行,仅返回来自xml的最后一个元素(其中CUSTOMERNO仅为122)。
请有人能告诉我如何将xml文本解析成一组行吗?提前感谢。

r1zk6ea1

r1zk6ea11#

我在Azure SQL数据库中创建了一个带有XML数据类型列的表,并将值插入其中。学生:

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

insert into students(studentId,studentName,request) 
values
     (1,'XXX','<Customers><row><CUSTOMERNO>100</CUSTOMERNO><OPERATION>INSERT</OPERATION><EMAIL>bill.gates@microsoft.com</EMAIL></row> </Customers>'),
     (2,'YYY','<Customers><row><CUSTOMERNO>101</CUSTOMERNO><OPERATION>INSERT</OPERATION><EMAIL>bill.gates@microsoft.com</EMAIL></row></Customers>'),
     (3,'ZZZ','<Customers><row><CUSTOMERNO>12</CUSTOMERNO><OPERATION>INSERT</OPERATION><EMAIL>bill.gates@microsoft.com</EMAIL></row><row>
               <CUSTOMERNO>947</CUSTOMERNO><OPERATION>UPDATE</OPERATION><EMAIL>steve.jobs@apple.com</EMAIL></row><row>
               <CUSTOMERNO>947</CUSTOMERNO><OPERATION>DELETE</OPERATION><EMAIL>steve.jobs@apple.com</EMAIL></row></Customers>');

参考图片:

我创建了另一个表,并使用下面的代码将数据从xml数据类型列检索到该表中

CREATE TABLE dbo.studentTable (
    studentId       INT NOT NULL,
    studentName     VARCHAR(20) NOT NULL,
    customerno      INT NOT NULL,
    operation       VARCHAR(20) NOT NULL,
    email           VARCHAR(100) NOT NULL
    )
INSERT INTO dbo.studentTable ( studentId,studentName, customerno, operation, email )
SELECT
    s.studentId,
    s.studentName,
    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)

表格输出:

我在Azure SQL数据库中执行此操作,因为Azure突触专用池不支持xml数据类型。我们可以使用Azure突触管道复制活动将上表复制到Azure突触专用池。我在Azure突触中创建了专用SQL池,并使用以下过程创建了管道和执行复制活动:已使用Azure SQL数据库链接服务创建Azure SQL数据库数据集。Azure SQL数据库链接服务:

Azure SQL数据库数据集:

复制活动的源:

我在SQL池中创建表-使用下面的代码:

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

正在创建SQL专用池链接服务:在链接服务选项中搜索synapse专用池。图片供参考:

选择并单击"继续",填写所需详细信息并单击"确定"。参考图像:

我通过启用批量插入选项将sink作为synapse专用池数据库。

我调试了管道,它运行成功。图片供参考:

表已成功复制到专用池。参考图像:

相关问题