2013-08-16 3 views
5

SQL Server 2012 데이터베이스에 저장된 XML 데이터를 쿼리하는 데 문제가 있습니다. 내가 쿼리하고자하는 노드 트리의 형식은 다음에 - 내가하고 싶은 무엇SQL을 사용하여 XML 데이터 열 쿼리

<eForm> 
    <page id="equalities" visited="true" complete="true"> 
     <Belief> 
     <item selected="True" value="Christian">Christian</item> 
     <item selected="False" value="Jewish">Jewish</item> 
     ... 
     </Belief> 
    </page> 
</eForm> 

선택한 속성이 true 같은 항목 노드의 값 속성을 반환합니다. SQL에서 XML 쿼리에 대한 자습서를 읽었으나 코드를 올바르게 처리 할 수는 없습니다.

감사 스투

답변

4

DEMO

SELECT [value].query('data(eForm/page/Belief/item[@selected="True"]/@value)') 
FROM test 
+0

내가 데이터() – StuartO

+1

하나의 작은 노트가이 유형의 XML하고 –

+0

이 http://sqlfiddle.com/# 볼 VARCHAR하지 않을에서 XPath를 포장하지 않은, 감사합니다! 6/ddaf2/2 –

0
DECLARE @T TABLE (X XML); 
INSERT @T VALUES ('<eForm> 
         <page id="equalities" visited="true" complete="true"> 
          <Belief> 
          <item selected="True" value="Christian">Christian</item> 
          <item selected="False" value="Jewish">Jewish</item> 
          </Belief> 
         </page> 
        </eForm>') 

SELECT item.value('item[1]', 'NVARCHAR(50)')  
FROM @T 
     CROSS APPLY X.nodes('eForm/page/Belief') i (item) 
WHERE item.value('(item[1]/@selected)[1]', 'VARCHAR(5)') = 'true'; 

N.B.

나는 MarcinJuraszek에 의해 게시 된 다른 접근법을 선호하지만 추출 할 데이터가 더 필요하면 아래에 이점이있을 수 있습니다. 원래는 대답을 삭제했지만이 방법이 유용하기 때문에 삭제하지 않은 모든 옵션을 보여줄 수 있습니다.

1
select 
    Value.value('(eForm/page/Belief/item[@selected="True"])[1]/@value', 'nvarchar(max)')  
from test 

sql fiddle demo

관련 문제