2017-06-14 3 views
0

Ich versuche, Informationen von verschiedenen Knoten mit der OPENXML-Funktion zu kombinieren. Um zum Beispiel die folgenden XML-Daten unter Verwendung würde ich in so viele Daten wie möglich füllen möchten und kommen auf der Grundlage der ‚PartyID‘ so kann ich die ‚PartyRoleCode‘ von ‚Moreinfo‘ erhalten:Verbinden Sie XML-Daten aus verschiedenen Elementen mit Transact-SQL

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

Wie könnte ich Ausgabe der folgende:

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

'VON OPENXML' mit den entsprechenden SPs vorzubereiten und ein Dokument ist veraltet und sollte nicht verwendet werden, um alle zu entfernen mehr (seltene Ausnahmen existieren). Verwenden Sie stattdessen die entsprechenden [Methoden, die der XML-Datentyp bietet] (https://msdn.microsoft.com/en-us/library/ms190798.aspx). – Shnugo

Antwort

1

es so versuchen:

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

--Die Abfrage alle <Party> Elemente lesen, verwenden APPLY diezu lesenund verwenden Sie einen anderen APPLY verwandten <PartyRef> Elemente lesen Sie die @PartyId als Ergebnis Set Spalte mit sql:column() mit:

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

Ich erkannte, dass es ein Problem mit den Daten selbst war, danke für all Ihre Hilfe! – user3457834

Verwandte Themen