2017-10-28 82 views
1

從下面的查詢中,我返回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個,甚至他們。你應該切絲person元素,而不是上:

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