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