2017-10-28 4 views
1

아래의 쿼리에서 두 개만 얻으려고하면 7 개의 행을 반환합니다. 내가 뭘 잘못하고 있니? 덕분에 - 당신이 person 수준의 아이에 XML을 분쇄기 때문이다하고도 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

(바보 문 게시물 대부분의 코드처럼 그것은 ... 보인다).

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 요소 분쇄기한다