sql server - xml query - concat - добавление пробела
Я хочу взять строку XML и преобразовать ее в SQL-таблицу с запятой-разделителем
declare @x xml --for example
set @x = '<root><row><a>a1</a><b>b2</b></row><row><a>aa1</a><b>bb2</b></row></root>'
SELECT T.c.query('.').query('for $i in row/*/text() return concat($i,";")').value('.', 'nvarchar(max)') AS result
FROM @x.nodes('root/row') T(c)
Результат:
a1; b2;
aa1; bb2;
Результат, который я хочу: (нет места)
a1;b2;
aa1;bb2;
>> Бонус: убрать последнюю точку с запятой
a1;b2
aa1;bb2
Благодарю вас!
3 ответа
Решение
Это можно сделать намного проще:
DECLARE @xml XML='<root>
<row>
<a>a1</a>
<b>b2</b>
</row>
<row>
<a>aa1</a>
<b>bb2</b>
</row>
</root>';
SELECT (
STUFF(
(
SELECT ';' + v.value('.','nvarchar(max)')
FROM r.nodes('*') AS B(v)
FOR XML PATH('')
),1,1,'')
)
FROM @xml.nodes('/root/row') AS A(r)
Сочетание REPLACE
, REVERSE
, а также STUFF
Вот как я смог добиться этого:
declare @x xml --for example
set @x = '<root><row><a>a1</a><b>b2</b></row><row><a>aa1</a><b>bb2</b></row></root>'
SELECT reverse(stuff(reverse(replace(T.c.query('.').query('for $i in row/*/text() return concat($i,";")').value('.', 'nvarchar(max)'), ' ', '')), 1, 1, '')) AS result
FROM @x.nodes('root/row') T(c)
Может быть лучший способ избавиться от пробелов, так как это также заменит любые пробелы в значениях узлов XML.
declare @x xml --for example
set @x = '<root><row><a>a1</a><b>b2</b></row><row><a>aa1</a><b>bb2</b></row></root>'
SELECT reverse(stuff(reverse(replace(T.c.query('.').query('for $i in row/*/text() return concat($i,";")').value('.', 'nvarchar(max)'), '; ', ';')), 1, 1, '')) AS result
FROM @x.nodes('root/row') T(c)