当SQL Server中的xml中有嵌套元素时,仅选择叶元素

当SQL Server中的xml中有嵌套元素时,仅选择叶元素,xml,sql-server-2008-r2,Xml,Sql Server 2008 R2,因为我找不到答案,所以发了这个帖子。道歉,如果它已经存在 问题:我使用XML描述具有分类层次结构的物种。我感兴趣的主要元素是分类单元(),它嵌套在层次结构中,从王国的分类等级到层次结构叶(底部)的物种、亚种或变种等级。我想从主元素的子元素中选择秩()、学名()和通用名(),但仅针对叶记录。换句话说,我想选择木鸭子(学名aixsponsa)的记录,但不是那些告诉我它在动物王国(kingdom Animalia),它是一只鸟(鸟类类)的记录 我想在SQLServer2008R2中解析XML,以便将其

因为我找不到答案,所以发了这个帖子。道歉,如果它已经存在

问题:我使用XML描述具有分类层次结构的物种。我感兴趣的主要元素是分类单元(
),它嵌套在层次结构中,从王国的分类等级到层次结构叶(底部)的物种、亚种或变种等级。我想从主元素的子元素中选择秩(
)、学名(
)和通用名(
),但仅针对叶记录。换句话说,我想选择木鸭子(学名aixsponsa)的记录,但不是那些告诉我它在动物王国(kingdom Animalia),它是一只鸟(鸟类类)的记录

我想在SQLServer2008R2中解析XML,以便将其附加到表中

以下是示例XML:

<?xml version="1.0"?>
<metadata>
    <idinfo>
        <taxonomy>
            <taxoncl>
                <taxonrn>Kingdom</taxonrn>
                <taxonrv>Animalia</taxonrv>
                <taxoncl>
                    <taxonrn>Phylum</taxonrn>
                    <taxonrv>Chordata</taxonrv>
                    <taxoncl>
                        <taxonrn>Subphylum</taxonrn>
                        <taxonrv>Vertebrata</taxonrv>
                        <taxoncl>
                            <taxonrn>Class</taxonrn>
                            <taxonrv>Aves</taxonrv>
                            <taxoncl>
                                <taxonrn>Order</taxonrn>
                                <taxonrv>Anseriformes</taxonrv>
                                <taxoncl>
                                    <taxonrn>Family</taxonrn>
                                    <taxonrv>Anatidae</taxonrv>
                                    <taxoncl>
                                        <taxonrn>Genus</taxonrn>
                                        <taxonrv>Aix</taxonrv>
                                        <taxoncl>
                                            <taxonrn>Species</taxonrn>
                                            <taxonrv>Aix sponsa</taxonrv>
                                            <common>Wood Duck</common>
                                        </taxoncl>
                                    </taxoncl>
                                    <taxoncl>
                                        <taxonrn>Genus</taxonrn>
                                        <taxonrv>Anas</taxonrv>
                                        <taxoncl>
                                            <taxonrn>Species</taxonrn>
                                            <taxonrv>Anas platyrhynchos</taxonrv>
                                            <common>Mallard</common>
                                        </taxoncl>
                                    </taxoncl>
                                </taxoncl>
                            </taxoncl>
                        </taxoncl>
                    </taxoncl>
                </taxoncl>
            </taxoncl>
        </taxonomy>
    </idinfo>
</metadata>

王国
动物
门
脊索动物
亚门
脊椎动物
班
鸟类
顺序
鹅形目
家庭
鸭科
属
艾克斯
种
林鸳鸯
木鸭
属
阿纳斯
种
鸭嘴兽
绿头鸭

我最终使用SQL server中XML数据类型的
节点()方法来获取所有
元素。然后,我在我的
WHERE
子句中使用了SQL Server中XML数据类型的
exist()
方法,仅过滤那些不包含另一个
元素的
元素

DECLARE @Data XML;
SET @Data = 
'<?xml version="1.0"?>
<metadata>
    <idinfo>
        <taxonomy>
            <taxoncl>
                <taxonrn>Kingdom</taxonrn>
                <taxonrv>Animalia</taxonrv>
                <taxoncl>
                    <taxonrn>Phylum</taxonrn>
                    <taxonrv>Chordata</taxonrv>
                    <taxoncl>
                        <taxonrn>Subphylum</taxonrn>
                        <taxonrv>Vertebrata</taxonrv>
                        <taxoncl>
                            <taxonrn>Class</taxonrn>
                            <taxonrv>Aves</taxonrv>
                            <taxoncl>
                                <taxonrn>Order</taxonrn>
                                <taxonrv>Anseriformes</taxonrv>
                                <taxoncl>
                                    <taxonrn>Family</taxonrn>
                                    <taxonrv>Anatidae</taxonrv>
                                    <taxoncl>
                                        <taxonrn>Genus</taxonrn>
                                        <taxonrv>Aix</taxonrv>
                                        <taxoncl>
                                            <taxonrn>Species</taxonrn>
                                            <taxonrv>Aix sponsa</taxonrv>
                                            <common>Wood Duck</common>
                                        </taxoncl>
                                    </taxoncl>
                                    <taxoncl>
                                        <taxonrn>Genus</taxonrn>
                                        <taxonrv>Anas</taxonrv>
                                        <taxoncl>
                                            <taxonrn>Species</taxonrn>
                                            <taxonrv>Anas platyrhynchos</taxonrv>
                                            <common>Mallard</common>
                                        </taxoncl>
                                    </taxoncl>
                                </taxoncl>
                            </taxoncl>
                        </taxoncl>
                    </taxoncl>
                </taxoncl>
            </taxoncl>
        </taxonomy>
    </idinfo>
</metadata>';

SELECT
    TaxonRank = TaxonomyXML.value('(taxonrn)[1]', 'varchar(20)'),
    SciName = TaxonomyXML.value('(taxonrv)[1]', 'varchar(255)'),
    CommonName = TaxonomyXML.value('(common)[1]', 'varchar(255)')
FROM
    @Data.nodes('/metadata/idinfo/taxonomy//*/taxoncl') AS XTbl(TaxonomyXML)
WHERE
    TaxonomyXML.exist('(taxoncl)[1]')=0;
TaxonRank   SciName              CommonName
Species     Aix sponsa           Wood Duck
Species     Anas platyrhynchos   Mallard