powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / XML parse XPath или XQuery. Вытащить данные родителя.
12 сообщений из 12, страница 1 из 1
XML parse XPath или XQuery. Вытащить данные родителя.
    #39608028
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  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>';


Хочу получить в итоге
Код: sql
1.
2.
3.
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
Но не задалось.

Спасибо.
...
Рейтинг: 0 / 0
XML parse XPath или XQuery. Вытащить данные родителя.
    #39608039
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  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 кривой
...
Рейтинг: 0 / 0
XML parse XPath или XQuery. Вытащить данные родителя.
    #39608040
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_,

Код: sql
1.
2.
3.
4.
  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)
...
Рейтинг: 0 / 0
XML parse XPath или XQuery. Вытащить данные родителя.
    #39608047
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  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.
...
Рейтинг: 0 / 0
XML parse XPath или XQuery. Вытащить данные родителя.
    #39608063
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_,

ваш XML содержит не реляционные данные.
...
Рейтинг: 0 / 0
XML parse XPath или XQuery. Вытащить данные родителя.
    #39608077
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_А именно чем?
Мне при этом не нужно перечисление (N'(QType/@qtid)[2] - произвольное количество может быть в любом из уровней. as always.
У вас dids закрытые (не могут содержать дочерних элементов). А потом, после предполагаемых дочерних элементов идет закрытие dids, который не открывался.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 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)
...
Рейтинг: 0 / 0
XML parse XPath или XQuery. Вытащить данные родителя.
    #39608088
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов_Промешан_,

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


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

Согласен.
...
Рейтинг: 0 / 0
XML parse XPath или XQuery. Вытащить данные родителя.
    #39608091
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Minamoto,felix_ff ваш вариант работает.

НО как я понимаю все это можно сделать средствами XPath. Может кто то знает как?
...
Рейтинг: 0 / 0
XML parse XPath или XQuery. Вытащить данные родителя.
    #39608094
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_,

что значит "средствами X-Path"?
мы вам мазуркой что ли достали данные?
...
Рейтинг: 0 / 0
XML parse XPath или XQuery. Вытащить данные родителя.
    #39608101
_Промешан_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff_Промешан_,

что значит "средствами X-Path"?
мы вам мазуркой что ли достали данные?
Я имею в виду без cross apply. Скажем так ссылкой на предков. Как в общем то описывают в ссылке которую я привел в первом сообщении.
...
Рейтинг: 0 / 0
XML parse XPath или XQuery. Вытащить данные родителя.
    #39608107
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_,

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

Код: sql
1.
2.
3.
4.
  select 
         T.c.query('..').value('(node()/@did)[1]', 'int'),
         T.c.value('@qtid', 'int')
  from @x.nodes('/datapacket/dids/QType') T(c)
...
Рейтинг: 0 / 0
XML parse XPath или XQuery. Вытащить данные родителя.
    #39608308
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Промешан_felix_ff_Промешан_,

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

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

Код: sql
1.
2.
3.
  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)
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / XML parse XPath или XQuery. Вытащить данные родителя.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]