2017-06-14 32 views
0

我试图使用OPENXML函数结合来自不同节点的信息。例如,使用下面的XML数据,我想填补尽可能多的数据可能基于从“MoreInfo”的“PartyId”这样我就可以得到“PartyRoleCode”加入:使用Transact-SQL从不同元素加入XML数据

<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  
+0

'FROM OPENXML'与相应的服务供应商可以准备,并删除文档是过时的并且不应该被使用的任何更多(罕见的例外情况)。而是使用适当的[XML数据类型提供的方法](https://msdn.microsoft.com/en-us/library/ms190798.aspx)。 – Shnugo

回答

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>[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>'; 

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

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

我意识到这是数据本身的问题,谢谢你的帮助! – user3457834