Разбор XML с SQL Server 2016 - PullRequest
       28

Разбор XML с SQL Server 2016

0 голосов
/ 12 марта 2019

Я пытаюсь прочитать только значение pmc, если оно есть в этой структуре. У меня есть узел удаления, который, как я думал, не повлияет на правильный ответ, но оставил полный путь

 <PubmedArticle>
    <MedlineCitation Status="MEDLINE" Owner="NLM">
        <PMID Version="1">29092946</PMID>        
    </MedlineCitation>
    <PubmedData>             
        <ArticleIdList>
            <ArticleId IdType="pubmed">29092946</ArticleId>
            <ArticleId IdType="pii">77/21/e79</ArticleId>
            <ArticleId IdType="doi">10.1158/0008-5472.CAN-17-0316</ArticleId>
            <ArticleId IdType="pmc">PMC5987533</ArticleId>
            <ArticleId IdType="mid">NIHMS971103</ArticleId>
        </ArticleIdList>        
    </PubmedData>
</PubmedArticle>

Текущий код:

COALESCE(nref.value('(OtherID[@Source="NLM" and text()[contains(.,"PMC")]])[1]', 'varchar(max)'), nref.value('(OtherID[@Source="NLM"][1])','varchar(max)')) PMCID,
nref.value('(Article/Journal/ISSN[@IssnType="Electronic"])[1]','varchar(15)') ISSN_Electronic,
nref.value('(Article/Journal/ISSN[@IssnType="Print"])[1]','varchar(15)') ISSN_Print         

с узлом, являющимся ссылкой, например:

FROM  
    [Publication.PubMed.General]  g
JOIN  
    [Publication.PubMed.AllXML] a ON a.pmid = g.pmid
CROSS APPLY  
    x.nodes('//MedlineCitation[1]') as R(nref)
WHERE 
    a.pmid = @pmid

Я написал код для извлечения значения pmc другим способом на

INSERT INTO [Publication.PubMed.ArticleIdList]  (pmid, ArticleId, IdType)
    SELECT * 
    FROM
        (SELECT DISTINCT
             pmid, nref.value('.','varchar(max)') ArticleId,
             nref.value('@IdType','varchar(max)') IdType 
         FROM
             [Publication.PubMed.AllXML]
         CROSS APPLY
             x.nodes('//PubmedData/ArticleIdList/ArticleId') as R(nref)
         WHERE 
             pmid = @pmid) t 
WHERE 
    ArticleId IS NOT NULL

DECLARE @pmc as nvarchar(25)

SET @pmc= (SELECT [ArticleId]     
           FROM [dbo].[Publication.PubMed.ArticleIdList]
           WHERE pmid = @pmid AND IdType = 'pmc')  

 UPDATE [dbo].[Publication.PubMed.General]
 SET [PMCID] = @pmc
 WHERE [PMID] =  @pmid 

Но, похоже, я иду далеко. Спасибо за любой вклад

1 Ответ

0 голосов
/ 12 марта 2019

Я думаю, что понял - Иногда просто написать все это, чтобы заставить вас думать

 nref.value('(//PubmedData[1]/ArticleIdList/ArticleId[@IdType="pmc"])[1]','varchar(15)') PMCID  
...