使用SQL查询读取XML子节点属性

使用SQL查询读取XML子节点属性,sql,sql-server,xml,xml-attribute,Sql,Sql Server,Xml,Xml Attribute,我在表(资格)中有一个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

我在表(资格)中有一个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”属性


有人能帮忙吗?

仅限
培训
徽章
元素的ID

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

徽章
元素的ID(不仅在
培训
中)

如果
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)

试试这个示例,它应该会有所帮助(只需将@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)
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