2014-10-17 13 views
0

在T-SQL中使用XPath我想從選項列表中獲取屬性值,其中在Value元素中找到了用於選擇正確列表項的Id。XPATH獲取ID爲同級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)