Sql server 在SQL Server 2016存储过程中解析XML

Sql server 在SQL Server 2016存储过程中解析XML,sql-server,xml,stored-procedures,Sql Server,Xml,Stored Procedures,我有以下存储在数据库中的xml <PubmedArticle> <MedlineCitation Status="PubMed-not-MEDLINE" Owner="NLM"> <PMID Version="1">31406890</PMID> <Article PubModel="Electronic-eCollection"> <Abstract>

我有以下存储在数据库中的xml

<PubmedArticle>
    <MedlineCitation Status="PubMed-not-MEDLINE" Owner="NLM">
        <PMID Version="1">31406890</PMID>
        <Article PubModel="Electronic-eCollection">
            <Abstract>
                <AbstractText Label="Objective" NlmCategory="UNASSIGNED">This study ....</AbstractText>
                <AbstractText Label="Method" NlmCategory="UNASSIGNED">A purposive ....</AbstractText>
                <AbstractText Label="Results" NlmCategory="UNASSIGNED">The data showed ....</AbstractText>
                <AbstractText Label="Conclusion" NlmCategory="UNASSIGNED">Targeted measures ....</AbstractText>
            </Abstract>
        </Article>
     </MedlineCitation>
</PubmedArticle>

我的问题是如何确保我的记录顺序相同?标签并不总是相同的,但发布顺序需要显示为XML中的顺序。当我插入记录时,它们似乎是以随机顺序排列的。

可以使用所谓的节点比较操作来模拟XML元素的顺序。因为您没有提供DDL和样本数据填充,所以下面是一个如何为您的案例实现它的示例。您需要向DB表中添加一个额外的列来存储它,并使用它来按其排序

SQL

DECLARE@xml=
不
31406890


可以使用所谓的节点比较操作来模拟XML元素的顺序。因为您没有提供DDL和样本数据填充,所以下面是一个如何为您的案例实现它的示例。您需要向DB表中添加一个额外的列来存储它,并使用它来按其排序

SQL

DECLARE@xml=
不
31406890


您需要一个可以在XML中排序的属性或节点。有吗?什么是出版物?“文章”?“摘要”?您需要一个可以在XML中排序的属性或节点。有吗?什么是出版物?“文章”?一个“摘要”?非常有效-关于DDL的声明很有趣-我已经阅读XML将近15年了,我认为从来没有提供过DDL。我知道XML文件的结构在过去的几年中已经改变了很多次,通常我发现是因为某些东西坏了。这来自一个政府API系统。最好的做法是在源系统(发送方)和目标系统(接收方)之间签订XSD合同。通过这种方式,无效的XML数据源不会离开源系统。这非常有效-关于DDL的声明非常有趣-我已经阅读XML将近15年了,我认为从来没有提供过DDL。我知道XML文件的结构在过去的几年中已经改变了很多次,通常我发现是因为某些东西坏了。这来自一个政府API系统。最好的做法是在源系统(发送方)和目标系统(接收方)之间签订XSD合同。这样,无效的XML数据源就不会离开源系统。
insert into [Publication.PubMed.Abstract] (pmid, label, NlmCategory, Abstract  )        
    select * 
    from 
        (select distinct 
             pmid, 
             nref.value('@Label', 'varchar(max)') Label,   
             nref.value('@NlmCategory', 'varchar(max)') NlmCategory, 
             nref.value('.', 'varchar(max)') AbstractText 
         from 
             [Publication.PubMed.AllXML] a
         cross apply 
             x.nodes('//MedlineCitation/Article/Abstract/AbstractText') as R(nref)
         where 
             a.pmid = @pmid ) t
DECLARE @xml XML =
N'<PubmedArticle>
    <MedlineCitation Status="PubMed-not-MEDLINE" Owner="NLM">
        <PMID Version="1">31406890</PMID>
        <Article PubModel="Electronic-eCollection">
            <Abstract>
                <AbstractText Label="Objective" NlmCategory="UNASSIGNED">This study ....</AbstractText>
                <AbstractText Label="Method" NlmCategory="UNASSIGNED">A purposive ....</AbstractText>
                <AbstractText Label="Results" NlmCategory="UNASSIGNED">The data showed ....</AbstractText>
                <AbstractText Label="Conclusion" NlmCategory="UNASSIGNED">Targeted measures ....</AbstractText>
            </Abstract>
        </Article>
    </MedlineCitation>
</PubmedArticle>';

SELECT nref.value('for $i in . return count(../*[. << $i]) + 1', 'INT') AS [AbstractNbr]
    , nref.value('@Label','varchar(max)') AS [Label]
    , nref.value('@NlmCategory','varchar(max)') AS [NlmCategory]
    , nref.value('.','varchar(max)') [AbstractText] 
FROM @xml.nodes('/PubmedArticle/MedlineCitation/Article/Abstract/AbstractText') as R(nref)