Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 XML parse XPath или XQuery. Вытащить данные родителя.  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
  declare @x xml='<datapacket>
    <dids did="1"/>
       <QType qtid="1"/>
       <QType qtid="2"/>
    </dids>
    <dids did="2"/>
       <QType qtid="1"/>
       <QType qtid="2"/>
    </dids>
  </datapacket>';

Хочу получить в итоге
c.value(N'(@did)[1]','smallint'),
                 t.c.value(N'(@qtid)[1]','smallint')
          from @x.nodes(N'/datapacket/dids/QType') t(c)


Получать qtid и did родителя. Интересует конечно не то чтобы именно родителя - ведь вложенность может быть больше.
Начинал смотреть отсюда: https://stackoverflow.com/questions/1890923/xpath-to-fetch-sql-xml-value
Но не задалось.

Спасибо.
27 фев 18, 17:53    [21223015]     Ответить | Цитировать Сообщить модератору
 Re: XML parse XPath или XQuery. Вытащить данные родителя.  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
  declare @x xml='<datapacket>
    <dids did="1">
       <QType qtid="1"/>
       <QType qtid="2"/>
    </dids>
    <dids did="2">
       <QType qtid="1"/>
       <QType qtid="2"/>
    </dids>
  </datapacket>';

select 
	t.c.value('(@did)[1]','smallint') as did
	,t.c.value(N'(QType/@qtid)[1]','smallint') as qtid1
	,t.c.value(N'(QType/@qtid)[2]','smallint') as qtid2
from @x.nodes('/datapacket/dids') t(c)


у вас xml кривой
27 фев 18, 18:04    [21223068]     Ответить | Цитировать Сообщить модератору
 Re: XML parse XPath или XQuery. Вытащить данные родителя.  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
_Промешан_,

  select T.c.value('@did', 'int') as did,
         T2.c.value('@qtid', 'int') as qtid
  from @x.nodes('/datapacket/dids') T(c)
      cross apply T.c.nodes('./QType') T2(c)
27 фев 18, 18:04    [21223069]     Ответить | Цитировать Сообщить модератору
 Re: XML parse XPath или XQuery. Вытащить данные родителя.  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Konst_One
  declare @x xml='<datapacket>
    <dids did="1">
       <QType qtid="1"/>
       <QType qtid="2"/>
    </dids>
    <dids did="2">
       <QType qtid="1"/>
       <QType qtid="2"/>
    </dids>
  </datapacket>';

select 
	t.c.value('(@did)[1]','smallint') as did
	,t.c.value(N'(QType/@qtid)[1]','smallint') as qtid1
	,t.c.value(N'(QType/@qtid)[2]','smallint') as qtid2
from @x.nodes('/datapacket/dids') t(c)


у вас xml кривой

А именно чем?
Мне при этом не нужно перечисление (N'(QType/@qtid)[2] - произвольное количество может быть в любом из уровней. as always.
27 фев 18, 18:13    [21223097]     Ответить | Цитировать Сообщить модератору
 Re: XML parse XPath или XQuery. Вытащить данные родителя.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
_Промешан_,

ваш XML содержит не реляционные данные.
27 фев 18, 18:35    [21223148]     Ответить | Цитировать Сообщить модератору
 Re: XML parse XPath или XQuery. Вытащить данные родителя.  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
_Промешан_
А именно чем?
Мне при этом не нужно перечисление (N'(QType/@qtid)[2] - произвольное количество может быть в любом из уровней. as always.

У вас dids закрытые (не могут содержать дочерних элементов). А потом, после предполагаемых дочерних элементов идет закрытие dids, который не открывался.

 declare @x xml='<datapacket>
    <dids did="1">
       <QType qtid="1"/>
       <QType qtid="2"/>
    </dids>
    <dids did="2">
       <QType qtid="1"/>
       <QType qtid="2"/>
    </dids>
  </datapacket>';


  select t.c.value('(@did)[1]','smallint') as did
	,t1.c.value(N'(@qtid)[1]','smallint') as qtid
from @x.nodes('/datapacket/dids') t(c) outer apply t.c.nodes('QType') as t1(c)
27 фев 18, 18:51    [21223195]     Ответить | Цитировать Сообщить модератору
 Re: XML parse XPath или XQuery. Вытащить данные родителя.  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Владислав Колосов
_Промешан_,

ваш XML содержит не реляционные данные.

Страшные слова.


У вас dids закрытые (не могут содержать дочерних элементов). А по

Согласен.
27 фев 18, 19:09    [21223236]     Ответить | Цитировать Сообщить модератору
 Re: XML parse XPath или XQuery. Вытащить данные родителя.  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
Minamoto,felix_ff ваш вариант работает.

НО как я понимаю все это можно сделать средствами XPath. Может кто то знает как?
27 фев 18, 19:10    [21223240]     Ответить | Цитировать Сообщить модератору
 Re: XML parse XPath или XQuery. Вытащить данные родителя.  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
_Промешан_,

что значит "средствами X-Path"?
мы вам мазуркой что ли достали данные?
27 фев 18, 19:14    [21223249]     Ответить | Цитировать Сообщить модератору
 Re: XML parse XPath или XQuery. Вытащить данные родителя.  [new]
_Промешан_
Member

Откуда:
Сообщений: 969
felix_ff
_Промешан_,

что значит "средствами X-Path"?
мы вам мазуркой что ли достали данные?

Я имею в виду без cross apply. Скажем так ссылкой на предков. Как в общем то описывают в ссылке которую я привел в первом сообщении.
27 фев 18, 19:25    [21223267]     Ответить | Цитировать Сообщить модератору
 Re: XML parse XPath или XQuery. Вытащить данные родителя.  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
_Промешан_,

а ну так бы сразу и сказали, а то я думал вообще какой то эфемерный XPath нужен

  select 
         T.c.query('..').value('(node()/@did)[1]', 'int'),
         T.c.value('@qtid', 'int')
  from @x.nodes('/datapacket/dids/QType') T(c)
27 фев 18, 19:33    [21223283]     Ответить | Цитировать Сообщить модератору
 Re: XML parse XPath или XQuery. Вытащить данные родителя.  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
_Промешан_
felix_ff
_Промешан_,

что значит "средствами X-Path"?
мы вам мазуркой что ли достали данные?

Я имею в виду без cross apply. Скажем так ссылкой на предков. Как в общем то описывают в ссылке которую я привел в первом сообщении.
Зачем? Это, имхо, логически неверно.

Но, если так хотите...

  select t.c.value('(../@did)[1]','smallint') as did
	,t.c.value(N'(@qtid)[1]','smallint') as qtid
from @x.nodes('/datapacket/dids/QType') t(c)
28 фев 18, 10:07    [21224016]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить