【问题标题】:Join XML data from different elements using Transact-SQL使用 Transact-SQL 连接来自不同元素的 XML 数据
【发布时间】:2017-06-14 13:35:52
【问题描述】:

我正在尝试使用 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>knowsnothing@gmail.com</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        knowsnothing@gmail.com
Wildling        Jon         Snow       M        knowsnothing@gmail.com
Kings Hand      Eddard      Stark      

【问题讨论】:

  • FROM OPENXML 与相应的 SP 准备和删除文档已过时,不应再使用(存在罕见的例外情况)。而是使用适当的methods the XML data type provides

标签: xml tsql xpath xml-parsing xquery


【解决方案1】:

试试这样:

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>knowsnothing@gmail.com</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>';

--查询将读取所有&lt;Party&gt;元素,使用APPLY读取@PartyId并使用另一个APPLY读取相关&lt;PartyRef&gt;元素,使用@PartyId作为结果集的列与@ 987654328@:

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);

【讨论】:

  • 我意识到这是数据本身的问题,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 2019-12-05
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
相关资源
最近更新 更多