Я пытаюсь прочитать только значение 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
Но, похоже, я иду далеко. Спасибо за любой вклад