2013-07-31 2 views
4

У меня есть один столбец XML (Criteria) в таблице (квалификации), который содержит различные XML:Чтение XML дочерний узел атрибутов с помощью SQL запроса

<training ID="173"><badge ID="10027" /><badge ID="10028" /></training> 
<book Category="Hobbies And Interests" PropertyName="C#" CategoryID="44" /> 
<sport Category="Hobbies And Interests" PropertyName="Cricket" CategoryID="46" /> 
<education ID="450" School="Jai ambe vidyalaya"></education> 

Я хочу, чтобы прочитать «значок» узел «ID» атрибуты для всех узлов под «обучающим» узлом.

Может ли кто-нибудь помочь?

ответ

6

идентификаторы badge элементов внутри training только

select t.c.value('.', 'int') ID 
from Qualifications q 
    cross apply q.Criteria.nodes('//training[badge]/badge[@ID]/@ID') t(c) 

идентификаторы badge элементов в любом месте (не только внутри training)

select t.c.value('.', 'int') ID 
from Qualifications q 
    cross apply q.Criteria.nodes('//badge[@ID]/@ID') t(c) 

Если Criteria колонка nvarchar типа, вы можете Чугунные xml, как:

select t.c.value('.', 'int') ID 
from Qualifications q 
    cross apply (select convert(xml, q.Criteria) xmlCriteria) a 
    cross apply a.xmlCriteria.nodes('//training[badge]/badge[@ID]/@ID') t(c) 
+0

Спасибо за ваше время и помощь! –

6

Попробуйте этот пример, это должно помочь (просто заменить @xml с именем таблицы/столбца)

DECLARE @xml XML 
SET @xml =' 
<training ID="173"> 
    <badge ID="10027" /> 
    <badge ID="10028" /> 
</training> 
<book Category="Hobbies And Interests" PropertyName="C#" CategoryID="44" /> 
<sport Category="Hobbies And Interests" PropertyName="Cricket" CategoryID="46" /> 
<education ID="450" School="Jai ambe vidyalaya"></education>' 

SELECT data.col.value('(@ID)[1]', 'int') 
FROM @xml.nodes('(/training/badge)') AS data(col) 

Выход:

10027 
10028 
+0

Спасибо за ваше время и помощь! –

+0

Это работает Великий Джон ... спасибо .. :) –

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