powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sql XML получить полный путь
3 сообщений из 3, страница 1 из 1
sql XML получить полный путь
    #39779932
SQLPowerUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допустим, есть XML такого вида:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<row1>
  <o1>
    <v1>апельсин</v1>
    <v2>банан</v2>
  </o1>
</row1>
<row2>
  <o2>
    <v1>виноград</v1>
    <v2>груша</v2>
  </o2>
</row2>


Можно ли получить значения с полными путями? (сортировка неважна)
fullPathvalue/row1/o1/v1апельсин/row1/o1/v2банан/row2/o2/v1виноград/row2/o2/v2груша
select @@versionMicrosoft SQL Server 2014 - 12.0.4100.1 (X64) Apr 20 2015 17:29:27 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
declare @t table (x xml);
insert into @t(x) values ('
<row1>
  <o1>
    <v1>апельсин</v1>
    <v2>банан</v2>
  </o1>
</row1>'), ('
<row2>
  <o2>
    <v1>виноград</v1>
    <v2>груша</v2>
  </o2>
</row2>');


select
x2.value('local-name(..)','nvarchar(max)') [elementName],
x2.value('.','nvarchar(max)') [elementValue]
from @t t
cross apply t.x.nodes(N'//*/text()') t2(x2)

;with xm as (
  select
  cast('/' + node.value('local-name(.)', 'varchar(900)') as varchar(900)) [fullPath],
  node.query('*') [children]
  from @t
  cross apply x.nodes('*') as roots(node)
  union all
  select
  cast(xm.fullPath + '/' + node.value('local-name(.)', 'varchar(900)') as varchar(900)),
  node.query('*') [children]
  from xm
  cross apply xm.children.nodes('*') as child(node)
)
select * from xm
where cast(children as nvarchar(max)) = ''
...
Рейтинг: 0 / 0
sql XML получить полный путь
    #39779970
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLPowerUser, ну так совсем чутка осталось
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
declare @xml xml = 
N'<row1>
  <o1>
    <v1>апельсин</v1>
    <v2>банан</v2>
  </o1>
</row1>'
;
WITH Xml_CTE AS
(
    SELECT
        CAST('/' + node.value('fn:local-name(.)', 'varchar(100)') AS varchar(100)) AS name,
        node.query('*') AS children,
		node.value('.', 'nvarchar(max)') as vl
    FROM @xml.nodes('/*') AS roots(node)

    UNION ALL

    SELECT
        CAST(x.name + '/' + node.value('fn:local-name(.)', 'varchar(100)') AS varchar(100)),
        node.query('*') AS children,
		node.value('.', 'nvarchar(max)') as vl
    FROM Xml_CTE x
    CROSS APPLY x.children.nodes('*') AS child(node)

)
SELECT DISTINCT name, vl
FROM Xml_CTE
WHERE children.exist('/*') = 0
OPTION (MAXRECURSION 1000)

...
Рейтинг: 0 / 0
sql XML получить полный путь
    #39779976
SQLPowerUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser,

спасибо! Прогнал на реальных данных, работает!
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sql XML получить полный путь
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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