【问题标题】:Read XML child node attributes using SQL query使用 SQL 查询读取 XML 子节点属性
【发布时间】:2013-07-31 13:40:05
【问题描述】:

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

我想读取“training”节点下所有节点的“badge”节点“ID”属性。

谁能帮忙?

【问题讨论】:

    标签: sql sql-server xml xml-attribute


    【解决方案1】:

    仅限training 内的badge 元素的ID

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

    badge 元素的 ID 任意位置(不仅在 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)
    

    【讨论】:

    • 感谢您的宝贵时间和帮助!
    【解决方案2】:

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

    【讨论】:

    • 感谢您的宝贵时间和帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多