Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / sql XML получить полный путь / 3 сообщений из 3, страница 1 из 1
27.02.2019, 15:51
    #39779932
SQLPowerUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sql XML получить полный путь
Допустим, есть 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
27.02.2019, 16:41
    #39779970
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sql XML получить полный путь
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
27.02.2019, 16:45
    #39779976
SQLPowerUser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
sql XML получить полный путь
buser,

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


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