powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / хитрый запрос к xml данным
13 сообщений из 13, страница 1 из 1
хитрый запрос к xml данным
    #39683913
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
народ, подскажите пожалуйста, как изящнее всего свести вот такой xml

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<root>
	<info>
		<id>1</id>
		<detail>
			<id>1</id>
			<quality>1</quality>
			<quality>2</quality>
			<quality>3</quality>
		</detail>
	</info>
	<info>
		<id>2</id>
		<detail>
			<id>5</id>
			<quality>6</quality>
			<quality>7</quality>
			<quality>8</quality>
		</detail>
	</info>
</root>



к датасету с вот такими данными? т.е id сводим к колонкам, а все значения zub сворачиваем в строку через запятую

info_id, detail_id, quality
1, 1, [1,2,3]
2, 5, [6,7,8]
...
Рейтинг: 0 / 0
хитрый запрос к xml данным
    #39683918
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди, странные желания, странный xml
Код: 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.
declare @x xml = '<root>
	<info>
		<id>1</id>
		<detail>
			<id>1</id>
			<quality>1</quality>
			<quality>2</quality>
			<quality>3</quality>
		</detail>
	</info>
	<info>
		<id>2</id>
		<detail>
			<id>5</id>
			<quality>6</quality>
			<quality>7</quality>
			<quality>8</quality>
		</detail>
	</info>
</root>'
select 
 i.val.value('./id[1]', 'int')
,i.val.value('(./detail/id)[1]', 'int')
,i.val.query('for $pj in (./detail/quality) return string(concat($pj, '','' ))')
								 .value('.', 'nvarchar(max)')

from @x.nodes('/root/info') i(val)

...
Рейтинг: 0 / 0
хитрый запрос к xml данным
    #39683924
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну xml я руками как пример набил, исходная портянка слишком велика.
Огромное спасибо, буду разбираться :)
...
Рейтинг: 0 / 0
хитрый запрос к xml данным
    #39683965
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
declare @x xml = N'<root>
	<info>
		<id>1</id>
		<detail>
			<id>1</id>
			<quality>1</quality>
			<quality>2</quality>
			<quality>3</quality>
		</detail>
	</info>
	<info>
		<id>2</id>
		<detail>
			<id>5</id>
			<quality>6</quality>
			<quality>7</quality>
			<quality>8</quality>
		</detail>
	</info>
</root>';

select
 t.n.value('id[1]', 'int'),
 t.n.value('(detail/id)[1]', 'int'),
 replace(t.n.query('data(detail/quality)').value('.', 'varchar(max)'), ' ', ', ')
from
 @x.nodes('/root/info') t(n);
...
Рейтинг: 0 / 0
хитрый запрос к xml данным
    #39683990
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
грустно понимать что ты убог :)
где можно почитать хорошую доку по xquery для sql сервера?
...
Рейтинг: 0 / 0
хитрый запрос к xml данным
    #39684074
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
энди, тут чуток есть

[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
хитрый запрос к xml данным
    #39684116
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алан, спасибо конечно, честно попытался посмотреть ролик в ютубе, но непойму толи в ролике с звуком что-то не то, толи у меня глючит, минуты через 4 уши начали кровоточить :)

Ладно, пока тут сидят знающие люди спрошу еще про оптимизацию, я так понимаю обращение к родительскому значению элемента в xquery довольно медленное и при большом количестве записей все запрос с секунд переходит на минуты, как можно оптимизировать?

Сейчас запрос без обработки родителя отрабатывает за 3 секунды и возвращает около 25к записей.

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT 
--t.c.value('(../IDCASE)[1]','int') as IDCASE,
t.c.value('(IDSERV)[1]','int') as IDSERV,
t.c.value('(PF)[1]','int') as PF,
t.c.value('(KodProfilGG)[1]','int') as KodProfilGG,
t.c.value('(DopInfo)[1]','varchar(400)') as DopInfo
FROM @x.nodes('/DI_List/SluchDI/UslDI') t(c)



Но стоит только включить ../IDCASE как скорость просто умирает, как лучше поступить для того чтобы быстродействие не просаживалось так кардинально?
...
Рейтинг: 0 / 0
хитрый запрос к xml данным
    #39684167
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам отвечу, мало ли кому пригодится :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT 
c.value('IDCASE[1]','int') as IDCASE,
d.value('./IDSERV[1]','int') as IDSERV,
d.value('./PF[1]','int') as PF,
d.value('./KodProfilGG[1]','int') as KodProfilGG,
d.value('./DopInfo[1]','varchar(400)') as DopInfo
FROM @x.nodes('/DI_List/SluchDI') AS SluchDI(c)
cross apply SluchDI.c.nodes('UslDI') as UslDI(d)



Скорость не падает :)
...
Рейтинг: 0 / 0
хитрый запрос к xml данным
    #39684177
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди,

openxml вам поможет радикально:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
declare @h int;

exec sp_xml_preparedocument @h output, @x;

select
 *
from
 openxml(@h, '/DI_List/SluchDI/UslDI', 2)
 with
 (
  IDCASE int '../IDCASE',
  IDSERV int 'IDSERV',
  PF int 'PF',
  KodProfilGG int 'KodProfilGG',
  DopInfo varchar(400) 'DopInfo'
 );

exec sys.sp_xml_removedocument @h;
...
Рейтинг: 0 / 0
хитрый запрос к xml данным
    #39684207
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю у openxml скорость не падает за счет того что xml сначала разбирается в памяти и доступ уже прямой к любому элементу без лишнего парсинга на лету как в случае xpath/xquery?
...
Рейтинг: 0 / 0
хитрый запрос к xml данным
    #39684222
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
энди,

выберите данные в таблицу, а затем агрегируйте колонки в строки, например CLR агрегатной функцией, в хелпе есть пример, в инете можно найти модификацию кода с разделителями. Я полный нуб в C#, но создал и протестировал ее за полчаса. В 2017 есть встроенный агрегатор.
...
Рейтинг: 0 / 0
хитрый запрос к xml данным
    #39684236
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эндиЯ так понимаю у openxml скорость не падает за счет того что xml сначала разбирается в памяти и доступ уже прямой к любому элементу без лишнего парсинга на лету как в случае xpath/xquery?Примерно так.
...
Рейтинг: 0 / 0
хитрый запрос к xml данным
    #39684290
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосовэнди,

выберите данные в таблицу, а затем агрегируйте колонки в строки, например CLR агрегатной функцией, в хелпе есть пример, в инете можно найти модификацию кода с разделителями. Я полный нуб в C#, но создал и протестировал ее за полчаса. В 2017 есть встроенный агрегатор.

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


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