2016-08-09 2 views
0

Я хочу взять строку XML и преобразовать его в SQL-таблицы с запятой-разграничитьSQL Server - XML-запрос - CONCAT - добавление пространства

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 

Спасибо!

ответ

1

Это можно сделать гораздо проще:

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) 
+0

Фантастический! :) Спасибо! – inon

+0

Как я могу отсортировать результат? и т. д., первое значение «aa1» в столбце ? – inon

+0

@inon Попробуйте 'ORDER BY v.value ('.', 'Nvarchar (max)')' перед 'FOR XML' – Shnugo

1

Сочетание 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.

+0

Хорошо! но он также удаляет пробелы внутри ячейки. Я изменил на Replace (...., ';', ';'), см. Мой ответ – inon

0
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) 
Смежные вопросы