2017-10-29 1 views
-1

Aus den Daten unten, wie kann ich den Namen des Landes erhalten, wie im Beispiel Ausgang I (dieser Teil in meiner versuchte Abfrage ????????????????)Wie bekomme ich XML-Tag-Werte?

declare @xml xml = 
'<animals> 
    <dog> 
     <country> 
      <australia>Perth</australia> 
     </country> 
    </dog> 
    <cat> 
     <country> 
      <USA>Miami</USA> 
     </country> 
    </cat> 
    <horse> 
     <country> 
      <Spain>Madrid</Spain> 
     </country> 
    </horse> 
</animals>' 

select 
    col.value('local-name(.)','char(20)') as animal 
    ,col.value('local-name(country/*/.)', 'varchar(25)') as country /* ?????????? */ 
    ,col.value('(*)[1]', 'varchar(25)') as city 
from @xml.nodes('/animals/*') tab(col) 

Erwartete Ausgabe erfordern gezeigt:

animal country  city 
------------------------------ 
dog  australia Perth 
cat  USA   Miami 
horse Spain  Madrid 

Antwort

0

Sie zerkleinern können das XML zweimal, auf Kind von animals Niveau und dann auf Kind von country Niveau. Auf diese Weise können local-name() auf beiden Elemente auswählen:

..... 
select 
    animals.value('local-name(.)','char(20)') as animal 
    ,country.value('local-name(.)', 'varchar(25)') as country 
    ,country.value('.', 'varchar(25)') as city 
from @xml.nodes('/animals/*') T1(animals) 
cross apply T1.animals.nodes('country/*') T2(country) 

rextester demo