2017-10-28 13 views
1

以下のクエリから、私は2つだけを取得すると予想されるとき私は7行を返しています。 私は何が間違っていますか?おかげで(愚かな声明 - あなたのポストは、ほとんどのコードであるように見える...)XMLがあまりにも多くの行を返す

go 
    declare @xml xml = 
    '<people> 
     <person ID="18" DOB="03 Apr 1955"> 
     <name> 
      <FirstName>Walter</FirstName> 
      <LastName>Thrip</LastName> 
     </name> 
     <Sex>M</Sex> 
     <Sex>X</Sex> 
     <title>Sir</title> 
     </person> 
     <person ID="19" DOB="01 Jan 2010"> 
     <name> 
      <FirstName>john</FirstName> 
      <LastName>smith</LastName> 
     </name> 
     <Sex>m</Sex> 
     <DOD>20 Jan 2014</DOD> 
     </person> 
    </people>' 
    select 
      n.value('../@ID','int') as ID 
      ,n.value('@DOB','datetime') as DOB 
      ,n.value('FirstName[1]','varchar(20)') as FirstName 
      ,n.value('LastName[1]','varchar(20)') as LastName 
      ,n.value('../Sex[1]', 'char(1)') as Sex 
      ,n.value('../DOD[1]', 'datetime') as DOD 
      ,n.value('../Title[1]', 'varchar(10)') as Title 
    from @xml.nodes('(/people/person/*)') as a(n) 

答えて

3

あなたはpersonレベルの子にXMLを細断処理し、7は彼らがさえ存在するためです。

select 
     n.value('@ID','int') as ID 
     ,n.value('@DOB','datetime') as DOB 
     ,n.value('(name/FirstName)[1]','varchar(20)') as FirstName 
     ,n.value('(name/LastName)[1]','varchar(20)') as LastName 
     ,n.value('Sex[1]', 'char(1)') as Sex 
     ,n.value('DOD[1]', 'datetime') as DOD 
     ,n.value('Title[1]', 'varchar(10)') as Title 
from @xml.nodes('/people/person') as a(n) 

rextester demo

:あなたは代わりにperson要素に細断処理す​​べきです
関連する問題