使用 Transact-SQL 连接来自不同元素的 XML 数据

用户3457834

我正在尝试使用 OPENXML 函数组合来自不同节点的信息。例如,使用以下 xml 数据,我想填写尽可能多的数据并根据“PartyId”加入,以便我可以从“MoreInfo”获取“PartyRoleCode”:

 <Root>
   <Parties>
      <Party PartyId="Party_1">
         <PartyTypeCode PartyTypeCode="Bastard"></PartyTypeCode>
         <PersonInfo>
            <FirstName>Jon</FirstName>
            <LastName>Snow</LastName>
            <Gender>M</Gender>
         </PersonInfo>
         <EmailAddress>[email protected]</EmailAddress>
      </Party>
      <Party PartyId="Party_2">
         <PartyTypeCode PartyTypeCode="Stark"></PartyTypeCode>
         <PersonInfo>
            <FirstName>Eddard</FirstName>
            <LastName>Stark</LastName>
         </PersonInfo>
      </Party>
   </Parties>
     <MoreInfo>
         <Parties>
            <PartyRef PartyId="Party_1">
               <PartyRole PartyRoleCode="Nights Watch"></PartyRole>
            </PartyRef>
            <PartyRef PartyId="Party_1">
               <PartyRole PartyRoleCode="Wildling"></PartyRole>
            </PartyRef>
            <PartyRef PartyId="Party_2">
               <PartyRole PartyRoleCode="Kings Hand"></PartyRole>
            </PartyRef>
         </Parties>
   </MoreInfo>
</Root>

我怎么能输出以下内容:

PartyRolecode   FirstName   LastName   Gender   Email Address
-------------   ---------   --------   ------   -------------
Nights Watch    Jon         Snow       M        [email protected]
Wildling        Jon         Snow       M        [email protected]
Kings Hand      Eddard      Stark      
修吾

像这样尝试:

DECLARE @xml XML=
N'<Root>
   <Parties>
      <Party PartyId="Party_1">
         <PartyTypeCode PartyTypeCode="Bastard"></PartyTypeCode>
         <PersonInfo>
            <FirstName>Jon</FirstName>
            <LastName>Snow</LastName>
            <Gender>M</Gender>
         </PersonInfo>
         <EmailAddress>[email protected]</EmailAddress>
      </Party>
      <Party PartyId="Party_2">
         <PartyTypeCode PartyTypeCode="Stark"></PartyTypeCode>
         <PersonInfo>
            <FirstName>Eddard</FirstName>
            <LastName>Stark</LastName>
         </PersonInfo>
      </Party>
   </Parties>
     <MoreInfo>
         <Parties>
            <PartyRef PartyId="Party_1">
               <PartyRole PartyRoleCode="Nights Watch"></PartyRole>
            </PartyRef>
            <PartyRef PartyId="Party_1">
               <PartyRole PartyRoleCode="Wildling"></PartyRole>
            </PartyRef>
            <PartyRef PartyId="Party_2">
               <PartyRole PartyRoleCode="Kings Hand"></PartyRole>
            </PartyRef>
         </Parties>
   </MoreInfo>
</Root>';

-- 查询将读取所有<Party>元素,用于APPLY读取@PartyId和使用另一个APPLY读取相关<PartyRef>元素,使用@PartyId作为结果集的列sql:column()

SELECT B.PartyID
      ,pr.value(N'(PartyRole/@PartyRoleCode)[1]',N'nvarchar(max)') AS PartyRoleCode
      ,p.value(N'(PersonInfo/FirstName/text())[1]',N'nvarchar(max)') AS FirstName
      ,p.value(N'(PersonInfo/LastName/text())[1]',N'nvarchar(max)') AS LastName
      ,p.value(N'(PersonInfo/Gender/text())[1]',N'nvarchar(max)') AS Gender
      ,p.value(N'(EmailAddress/text())[1]',N'nvarchar(max)') AS eMail
FROM @xml.nodes(N'/Root/Parties/Party') AS A(p)
OUTER APPLY(SELECT p.value(N'@PartyId','nvarchar(max)') AS PartyID) AS B
OUTER APPLY @xml.nodes(N'Root/MoreInfo/Parties/PartyRef[@PartyId=sql:column("B.PartyID")]') AS C(pr);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Transact-SQL中使用XML

来自分类Dev

如何连接来自SQL Server XML查询的数据?

来自分类Dev

Excel如何使用Transact SQL从SQL Server导入数据

来自分类Dev

Excel如何使用Transact SQL从SQL Server导入数据

来自分类Dev

使用TRANSACT-SQL将节点添加到XML

来自分类Dev

使用Transact sql的临时表

来自分类Dev

SQL Merge 连接来自两个不同数据库的两个表

来自分类Dev

基于外键的Transact SQL返回数据

来自分类Dev

如何使用PostgreSQL连接来自不同数据库的两个表?

来自分类Dev

在Transact-SQL中使用OLE自动化对象编写XML

来自分类Dev

无法启动Transact-SQL调试器,无法连接到数据库引擎实例

来自分类Dev

在Transact SQL中使用HTML标记

来自分类Dev

使用FK连接来自两个表的数据

来自分类Dev

使用内部选择连接来自 3 个表的数据

来自分类Dev

DataLength (Transact-SQL), why this irregularity while measuring an xml file?

来自分类Dev

使用SQL提取XML数据

来自分类Dev

Laravel使用不同的连接来插入和选择数据

来自分类Dev

使用xml将来自不同行的数据连接到一列时如何删除空间?

来自分类Dev

SQL数据作为XML元素

来自分类Dev

连接来自不同数据库的2个表

来自分类Dev

Laravel 4:连接来自不同数据库的表

来自分类Dev

Pandas:连接来自不同来源的数据框

来自分类Dev

使用XML的SQL连接

来自分类Dev

使用XML的SQL连接

来自分类Dev

连接来自不同表的 2 个 SQL 查询

来自分类Dev

SQL连接来自多个数据库连接的多个表

来自分类Dev

使用awk连接来自不同文件的多列

来自分类Dev

使用SQL参数查询XML数据

来自分类Dev

使用SQL从XML提取相关数据