У меня есть следующее поле XML():
<A>
<B name = "B1">
<C>
<D name = "D1">
<E name = "E1"/>
<E name = "E2"/>
<E name = "E3"/>
</D>
<D name = "D2">
<E name = "E4"/>
<E name = "E5"/>
<E name = "E6"/>
</D>
</C>
</B>
<B name = "B3">
<C>
<D name = "D11">
<E name = "E11"/>
<E name = "E22"/>
<E name = "E33"/>
</D>
<D name = "D22">
<E name = "E44"/>
<E name = "E55"/>
<E name = "E66"/>
</D>
</C>
</B>
</A>
Если я хочу использовать nodes() и value() для получения данных из XML, что мне делать, результат должен быть таким:
Я пробовал следующий запрос:
SELECT NodePath.value('@name', 'varchar(100)') B,
NodePath.value('(./C/D/@name)[1]', 'varchar(64)') D,
NodePath.value('(./C/D/E/@name)[1]', 'varchar(100)') E
FROM XmlTable xt
cross apply xt.XmlField.nodes('/A/B') Node(NodePath)
но мне кажется, что требуется только одно E из разных B
@AlwaysLearning, простите, я исправил это.





SELECT NodePath.value('@name', 'varchar(100)') B,
--NodePath.value('(./C/D/@name)[1]', 'varchar(64)') D,
--NodePath.value('(./C/D/E/@name)[1]', 'varchar(100)') E,
d.d.value('@name', 'varchar(64)') AS D,
e.e.value('@name', 'varchar(100)') AS E
FROM XmlTable xt
CROSS APPLY xt.XmlField.nodes('/A/B') AS Node(NodePath)
CROSS APPLY Node.NodePath.nodes('C/D') AS d(d)
CROSS APPLY d.d.nodes('E') AS e(e)
Спасибо, это работает! И я также задаюсь вопросом о его производительности. Будет ли его производительность лучше, чем следующий запрос? SELECT NodePath.value(../../../'@name', 'varchar(100)') B, NodePath.value('@../name', 'varchar(64)') AS D, NodePath.value('@name', 'varchar(100)') AS E FROM XmlTable xt CROSS APPLY xt.XmlField.nodes('/A/B/C/D/E') AS Node(NodePath)
[email protected]. В общем, навигация вверх по структуре/иерархии xml (от дочернего к родительскому узлу) с использованием parent:: или аббревиатуры '../' является более дорогостоящей/затратной, чем получение сначала родителя, а затем детей. Вы можете сравнить и проверить различия двух планов выполнения (для подъема по иерархии требуется 2 дополнительных фильтра xpath). Это не означает, что ваше предложение будет медленнее. Более дорогой запрос получает больше памяти, и иногда это может привести к тому, что дорогой запрос будет выполняться быстрее, чем более дешевый. Просто протестируйте его в своей среде и выберите тот, который вам подходит.
Пример XML недействителен. Закрывающие теги должны использовать символ
/, а не символ «\». например:<D>...</D>.