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

Код: 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
25.09.2018, 19:15
    #39707948
Владимир Затуливетер
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние одноименных тэгов в OpenXML
Можно вот так:
Код: 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
26.09.2018, 06:17
    #39708119
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние одноименных тэгов в OpenXML
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
26.09.2018, 08:49
    #39708155
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние одноименных тэгов в OpenXML
XQuery еще не предлагали?
Код: sql
1.
select @x.query('for $b in /root/data/b return concat(data($b),'';'')')
...
Рейтинг: 0 / 0
26.09.2018, 10:12
    #39708208
Nikls
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние одноименных тэгов в OpenXML
Всем спасибо!
Взял вариант Веры Павловны)
Вариант с concat ни в 2005ом ни в 2008 не работает, ругается, что нет такой функции
А последний вариант с x.query склеивает из всех блоков, а как его съэплаить по parentid ума не хватает, т.к. c query не работал.
...
Рейтинг: 0 / 0
26.09.2018, 10:19
    #39708214
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние одноименных тэгов в OpenXML
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
26.09.2018, 10:55
    #39708256
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние одноименных тэгов в OpenXML
Если 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
26.09.2018, 11:11
    #39708279
Посетитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Слияние одноименных тэгов в OpenXML
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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Слияние одноименных тэгов в OpenXML / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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