Анализ XML с помощью SQL Server 2016

#xml #stored-procedures #sql-server-2016

#xml #хранимые процедуры #sql-server-2016

Вопрос:

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

 <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,
  

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

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

Ответ №1:

Я немного изменил ваш 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] ) вы будете использовать селектор свойств.