Destiny
|
Posted: Mon Dec 05, 2022 13:32 Post subject: |
|
|
olegvsk wrote: | Зависит от того, где используется XPath. MS SQL, например, не примет /Root/OnlyNode, а попросит (/Root/OnlyNode)[1] либо /Root[1]/OnlyNode[1]. Поэтому сделал XPath избыточным. |
Да, нашел инфу о том, что у мелкомягких свой подход с типизации данных в XQuery/XPath.
И да оба ваши варианта типа решают проблему. НО все же заметим, что первый вариант оказывается наиболее приближен к логическому выделению пути: /LIST_OF_PERSONS/DATA[2]/PASSPORT/SERIJA
вот пример:
Code: |
with TEST(info) as
(
select info
from (values (cast('<LIST_OF_PERSONS xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<DATA>
<NAME>nm1</NAME>
<ID>12</ID>
<PASSPORT>
<SERIJA>mn123</SERIJA>
<NOMER>3335</NOMER>
</PASSPORT>
</DATA>
<DATA>
<NAME>nm2</NAME>
<ID>23</ID>
<PASSPORT>
<SERIJA>mn354</SERIJA>
<NOMER>5645</NOMER>
</PASSPORT>
</DATA>
<DATA>
<NAME>nm3</NAME>
<ID>34</ID>
<PASSPORT>
<SERIJA>mn456</SERIJA>
<NOMER>64897</NOMER>
</PASSPORT>
</DATA>
</LIST_OF_PERSONS>' as xml))) TEST(info)
)
SELECT info.value('(/LIST_OF_PERSONS/DATA[2]/PASSPORT/SERIJA)[1]', 'nvarchar(20)') as Seria
FROM TEST;
|
Если MS SQL под рукой нет - то вот тут онлайн можно запустить:
https://data.stackexchange.com/stackoverflow/query/1683212?opt.withExecutionPlan=true
Т.е. для MS SQL да, надо делать допущение, но оно возможно быть минимальным! Т.е. основа это:
/LIST_OF_PERSONS/DATA[2]/PASSPORT/SERIJA, а доработкой является лишь взятие основы в (...)[1]
И прошу заметить - этого действия вы все равно не делаете! А значит напрямую использовать этот путь
в MS SQL все равно нельзя
Отсюда вывод-предложение. Команду копирования XPath стоит сделать в виде выпадающего меню и в нем
предлагать под какие задачи пользователю будет удобнее копировать этот путь.
Для простых, нетребовательных случаев это:
/LIST_OF_PERSONS/DATA/PASSPORT/SERIJA
хотя не могу найти пример такого использования, ведь это выборка всего и вся...
для более корректного уточнения, ибо мы же на конкретном элементе вызываем команду:
/LIST_OF_PERSONS/DATA[2]/PASSPORT/SERIJA
спецом для использования в MS SQL напрямую:
(/LIST_OF_PERSONS/DATA[2]/PASSPORT/SERIJA)[1]
Кстати, проверять все пути вот тут: https://www.videlibri.de/cgi-bin/xidelcgi
можно - там все вариации спецификаций поддерживаются вроде как. |
|