使用Transact-SQL加入来自不同元素的XML数据

时间:2017-06-14 13:35:53

标签: xml tsql xpath xml-parsing xquery

我尝试使用OPENXML功能组合来自不同节点的信息。例如,使用以下xml数据我想尽可能多地填写数据并根据' PartyId'加入。所以我可以得到#PartyDoleCode'来自' MoreInfo':

script.py

我如何输出以下内容:

print("DONE")

1 个答案:

答案 0 :(得分: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>';

- 查询将读取所有<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);