2013-08-16 5 views
5

У меня возникают проблемы с запросом на данные XML, хранящиеся в базе данных SQL Server 2012. Узел дерева Я хочу запроса в следующем формате -Использование 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> 

То, что я хотел бы сделать, это вернуть значение атрибута узла элемента, где выбранный атрибут равно верно. Я прочитал несколько руководств по запросу XML в SQL, но, похоже, не может получить код правильно.

Благодаря Stu

ответ

4

DEMO

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

Спасибо, я не оборачивая XPath в данных() – StuartO

+1

одна маленькая заметка, это будет типа XML, а не VARCHAR –

+0

см http://sqlfiddle.com/#! 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'; 

нотабене

Я действительно предпочитаю другой подход, опубликованный MarcinJuraszek, однако для получения дополнительных данных для извлечения могут быть преимущества ниже. Я изначально удалил ответ, но могут быть ситуации, когда этот подход полезен, поэтому в интересах отображения всех параметров, которые я восстановил.

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

sql fiddle demo

Смежные вопросы