2017-06-14 6 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

'OPENXML'からの対応のSPとは時代遅れであり、いずれかを使用すべきではありませんもっと(まれな例外が存在する)。むしろ適切な[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を使用しますとsql:column()と、結果セットの列として@PartyIdを使用して、関連<PartyRef>要素読み取るために別のAPPLYを使用:調製するために、文書を除去する

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

関連する問題