2014-10-17 5 views
0

T-SQL에서 XPath 사용 올바른 목록 항목을 선택하는 ID가 Value 요소에있는 옵션 목록에서 특성 값을 가져 오려고합니다.XPATH 형제로 ID가있는 목록 항목 가져 오기

도움을 주시면 감사하겠습니다.

declare @myTable table (pk int primary key identity(1,1), myXML xml) 

insert into @myTable values (' 
<Fields> 
     <Field ID="1111"> 
     <Description>How Now Brown Cow</Description> 
     <Value>3</Value> 
     <Options> 
      <Options> 
      <Option OptionContent="Select one" OptionID="-1" /> 
      <Option OptionContent="Mars"  OptionID="1" /> 
      <Option OptionContent="Pluto"  OptionID="2" /> 
      <Option OptionContent="Saturn"  OptionID="3" /> 
      </Options> 
     </Options> 
     </Field> 
     <Field ID="2222"> 
     <Description>Foo Bar</Description> 
     <Value>2</Value> 
     <Options> 
      <Options> 
      <Option OptionContent="Select one" OptionID="-1" /> 
      <Option OptionContent="Coffee"  OptionID="1" /> 
      <Option OptionContent="Tea"   OptionID="2" /> 
      <Option OptionContent="Water"  OptionID="3" /> 
      <Option OptionContent="Juice"  OptionID="4" /> 
      <Option OptionContent="Water"  OptionID="5" /> 
      </Options> 
     </Options> 
     </Field> 
</Fields>  
') 

select 
    myField.ref.value('@ID', 'smallint')        as [ID] 
    ,myField.ref.value('(./Description)[1]', 'nvarchar(10)')   as [Description] 
    ,myField.ref.value('(./Value)[1]', 'int')       as [Value] 
    ,myField.ref.value('(./Options/Options/Option[@OptionID="-1"]/@OptionContent)[1]', 'nvarchar(10)')  as [SelectedDescription] 
from @myTable c 
cross apply c.myXML.nodes('/Fields/Field') myField(ref) 

ID  Description Value  Actual  Expected 
------ ----------- ----------- ---------- -------- 
1111 How Now Br 3   NULL  Saturn 
2222 Foo Bar  2   NULL  Tea 

답변

2

변경

(./Options/Options/Option[@OptionID="-1"]/@OptionContent)[1] 

let $id := ./Value[1] return (./Options/Options/Option[@OptionID=$id]/@OptionContent)[1] 

에 따라서 당신의 쿼리해야

select 
    myField.ref.value('@ID', 'smallint')        as [ID] 
    ,myField.ref.value('(./Description)[1]', 'nvarchar(10)')   as [Description] 
    ,myField.ref.value('(./Value)[1]', 'int')       as [Value] 
    ,myField.ref.value('let $id := ./Value[1] return (./Options/Options/Option[@OptionID=$id]/@OptionContent)[1]', 'nvarchar(10)')  as [SelectedDescription] 
from @myTable c 
cross apply c.myXML.nodes('/Fields/Field') myField(ref) 
관련 문제