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

Разбор XML с SQL Server 2016

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

В прошлом, когда у меня было

<Article PubModel="Print-Electronic">
    <Journal>
        <ISSN IssnType="Electronic">1360-0443</ISSN>
        <JournalIssue CitedMedium="Internet">

или

<Journal>
    <ISSN IssnType="Print">2234-943X</ISSN>
    <JournalIssue CitedMedium="Print">
    <Volume>8</Volume>

Я бы набрал номер ISSN в моей хранимой процедуре, используя

nref.value('Article[1]/Journal[1]/ISSN[1]','varchar(max)') ISSN,

Теперь я хочу определить, какой это тип ISSN, но я не уверен, куда поместить @Print или @ Electronic.

Я пробовал

nref.value('Article[1]/Journal[1]/ISSN[1]/@Electronic', 'varchar(max)') ISSN,

и

nref.value('Article[1]/Journal[1]/@Electronic', 'varchar(max)') ISSN,

Ни один не работал. Я хочу поместить Print ISSN в поле ISSN_Print, если оно есть, и Electronic в поле ISSN_Electronic, если оно есть.

Спасибо за помощь

1 Ответ

2 голосов
/ 08 марта 2019

Я немного выдумал ваш XML, чтобы получить рабочий пример. Но это должно дать вам то, что вы ищете:

declare @x xml = '<Journal>
            <ISSN IssnType="Print">2234-943X</ISSN>
            <ISSN IssnType="Electronic">1360-0443</ISSN>
            <JournalIssue CitedMedium="Print"/>
            <Volume>8</Volume></Journal>';

select @x.value('(Journal/ISSN[@IssnType="Print"])[1]', 'varchar(40)'),
    @x.value('(Journal/ISSN[@IssnType="Electronic"])[1]', 'varchar(40)');

В частности, вместо обычного селектора (например, [1]) вы будете использовать вместо него селектор свойств.

...