powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Слияние одноименных тэгов в OpenXML
8 сообщений из 8, страница 1 из 1
Слияние одноименных тэгов в OpenXML
    #39707915
Nikls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Подскажите, как можно с минимальными затратами слить одноименные тэги в одно поле через разделитель? Облазил весь инет, нигде примеров не нашел :(

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
declare @doc int, @x xml = 
'<root>
 <data>
   <a>гы</a>
   <b>2</b>
   <b>33</b>
   <c>44</c>
 </data>
</root>';

exec sp_xml_preparedocument @doc output, @x;

select *
from openxml(@doc, '/root/data', 2)
with
(
 a char(2) 'a',
 b char(2) 'b', --здесь должно получиться "2;33;"
 c int 'c'
 )

exec sp_xml_removedocument @doc;



Кол-во тэга <b> заранее не известно. Можно ли что-то написать в XPath в ColPattern ?
Видел такую штуку, но можно ли и как её здесь прикрутить, не знаю: <xsl:value-of select="/root/item" separator=", "/>
...
Рейтинг: 0 / 0
Слияние одноименных тэгов в OpenXML
    #39707948
Владимир Затуливетер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно вот так:
Код: 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.
declare @xml xml = N'
<root>
  <data>
    <a>гы</a>
    <b>2</b>
    <b>33</b>
    <c>44</c>
  </data>
</root>
';

select x.c
     , a.val as a
     , b.val as b
     , c.val as c
from (select 1) x(c)
    outer apply ( 
        select concat(t.v.value('.', 'nvarchar(max)'), ';') 
        from @xml.nodes('root/data/a') t(v) 
        for xml path('') 
    ) a(val)
    outer apply ( 
        select concat(t.v.value('.', 'nvarchar(max)'), ';')
        from @xml.nodes('root/data/b') t(v) 
        for xml path('') 
    ) b(val)
    outer apply ( 
        select concat(t.v.value('.', 'nvarchar(max)'), ';')
        from @xml.nodes('root/data/c') t(v) 
        for xml path('') 
    ) c(val)
...
Рейтинг: 0 / 0
Слияние одноименных тэгов в OpenXML
    #39708119
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NiklsВидел такую штуку, но можно ли и как её здесь прикрутить, не знаю: <xsl:value-of select="/root/item" separator=", "/>
Никак - эта штука является XSLT-инструкцией, а MSSQL из коробки XSLT не поддерживает.
Можно сделать так:
Код: 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.
38.
39.
40.
41.
42.
declare @doc int, @x xml;
set @x = 
'<root>
 <data>
   <a>гы</a>
   <b>2</b>
   <b>33</b>
   <c>44</c>
 </data>
 <data>
   <a>бу</a>
   <b>9</b>
   <b>888</b>
   <c>555</c>
 </data>
</root>';

exec sp_xml_preparedocument @doc output, @x;

select x.a, f.b, x.c, x.id
from openxml(@doc, '/root/data', 2)
with
(
  a char(2) 'a',
  c int 'c',
  id int '@mp:id'
) x
cross apply (
  select v.x.value('.', 'varchar(max)')
  from (
    select x2.b+';'
    from openxml(@doc, '/root/data/b', 2)
    with
    (
      b varchar(2) '.',
      parent int '@mp:parentId'
    ) x2
    where x2.parent=x.id
    for xml path(''), type
  ) v(x)
) f(b)
exec sp_xml_removedocument @doc;
...
Рейтинг: 0 / 0
Слияние одноименных тэгов в OpenXML
    #39708155
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XQuery еще не предлагали?
Код: sql
1.
select @x.query('for $b in /root/data/b return concat(data($b),'';'')')
...
Рейтинг: 0 / 0
Слияние одноименных тэгов в OpenXML
    #39708208
Nikls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо!
Взял вариант Веры Павловны)
Вариант с concat ни в 2005ом ни в 2008 не работает, ругается, что нет такой функции
А последний вариант с x.query склеивает из всех блоков, а как его съэплаить по parentid ума не хватает, т.к. c query не работал.
...
Рейтинг: 0 / 0
Слияние одноименных тэгов в OpenXML
    #39708214
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NiklsВсем спасибо!
Взял вариант Веры Павловны)
Вариант с concat ни в 2005ом ни в 2008 не работает, ругается, что нет такой функции
А последний вариант с x.query склеивает из всех блоков, а как его съэплаить по parentid ума не хватает, т.к. c query не работал.

Код: sql
1.
2.
select b.b.query('for $b in b return concat(data($b),'';'')')
  from @x.nodes('/root/data') b(b)
...
Рейтинг: 0 / 0
Слияние одноименных тэгов в OpenXML
    #39708256
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если openxml не обязательно:
Код: sql
1.
2.
3.
4.
5.
6.
select
 t.n.value('a[1]', 'varchar(30)'),
 replace(t.n.query('data(b)').value('.', 'varchar(max)'), ' ', ';'),
 t.n.value('c[1]', 'int')
from
 @x.nodes('/root/data') t(n);
...
Рейтинг: 0 / 0
Слияние одноименных тэгов в OpenXML
    #39708279
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Код: sql
1.
2.
3.
4.
5.
6.
select
 t.n.value('a[1]', 'varchar(30)'),
 replace(t.n.query('data(b)').value('.', 'varchar(max)'), ' ', ';'),
 t.n.value('c[1]', 'int')
from
 @x.nodes('/root/data') t(n);



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


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