Чтение атрибутов дочернего узла XML с помощью SQL-запроса

У меня есть один столбец XML (Критерии) в таблице (Квалификации), который содержит другой 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>

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

Кто-нибудь может помочь?


person Dhaval Panchal    schedule 31.07.2013    source источник


Ответы (2)


ID badge элементов только внутри training

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

ID 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)
person i-one    schedule 31.07.2013
comment
Спасибо за ваше время и помощь! - person Dhaval Panchal; 31.07.2013

Попробуйте этот пример, он должен помочь (просто замените @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
person JohnD    schedule 31.07.2013
comment
Спасибо за ваше время и помощь! - person Dhaval Panchal; 31.07.2013