2015-02-27 4 views
2

Gurus, У меня есть значение столбца XML, как показано ниже в SQL 2012SQL Server - преобразовать XML-столбец в строку с разделителями

'<XMLDoc> 
<AAA> 
    <Name>Name_A</Name> 
    <Value>Val_A</Value> 
</AAA> 
<AAA> 
    <Name>Name_B</Name> 
    <Value>Val_B</Value> 
</AAA> 
<AAA> 
    <Name>Name_C</Name> 
    <Value>Val_C</Value> 
</AAA> 
<AAA> 
    <Name>Name_D</Name> 
    <Value>Val_D</Value> 
</AAA> 
<AAA> 
    <Name>Name_E</Name> 
    <Value>Val_E</Value> 
</AAA> 
: 
: 
<AAA> 
    <Name>Name_Z</Name> 
    <Value>Val_Z</Value> 
</AAA> 
</XMLDoc>' 

Мы имеем требование хранить первые 2 узлов в отдельных столбцах, а остальные узлы (длина может от 0 до n) в виде разделительной строки в третьем столбце.

Я попытался SQL, как показано ниже, нужна помощь, чтобы заполнить 3-ю колонку

SELECT Col1 = Col.value('(/AAA/Value)[1]', 'varchar(255)') , 
Col2 = Col.value('(/AAA/Value)[2]', 'varchar(255)') 
FROM table 

Нам нужен выход, как

Col1    Col2     Col3 
Val_A    Val_B     Val_c,Val_D,Val_E....Val_n 

ответ

1

Gurus, я был в состоянии решить этот вопрос ниже SQL

SELECT Col1 = Col.value('(/XMLDoc/AAA/Value)[1]', 'varchar(255)') , 
Col2 = Col.value('(/XMLDoc/AAA/Value)[2]', 'varchar(255)') , 
Col3 = STUFF((SELECT ',' + x.value('(Value)[1]', 'varchar(50)') FROM Col.nodes('/XMLDoc/AAA[position()>2]') AS Node(x) FOR XML PATH('')), 1, 1, '') 
FROM table 

Дай мне знать, если какое-либо лучшее решение

0

Следующая T-SQL должен решить вашу проблему в SQL Server 2012 с использованием подзапроса с FOR XML PATH

SELECT Col1 = Col.value('(/XMLDoc/AAA/Value)[1]', 'varchar(255)'), 
     Col2 = Col.value('(/XMLDoc/AAA/Value)[2]', 'varchar(255)'), 
     Col3 = (SELECT ', '+P.N.value('text()[1]', 'varchar(max)') 
       FROM [table].Col.nodes('/XMLDoc/AAA[position()>2]/Value') P(N) 
       FOR XML PATH(''), type).value('substring(text()[1], 3)', 'varchar(max)') 
FROM [table] 
0

Вы можете проверить это ... Я беру какую-то часть из @svain.

declare @xmlstr varchar(1000) = '<XMLDoc> 
<AAA> 
    <Name>Name_A</Name> 
    <Value>Val_A</Value> 
</AAA> 
<AAA> 
    <Name>Name_B</Name> 
    <Value>Val_B</Value> 
</AAA> 
<AAA> 
    <Name>Name_C</Name> 
    <Value>Val_C</Value> 
</AAA> 
<AAA> 
    <Name>Name_D</Name> 
    <Value>Val_D</Value> 
</AAA> 
<AAA> 
    <Name>Name_E</Name> 
    <Value>Val_E</Value> 
</AAA> 
</XMLDoc>' 

declare @xml xml = (select cast(@xmlstr as xml)) 


select 
    distinct  
    xmlnodes.idnode.value('(/XMLDoc/AAA/Value)[1]', 'varchar(255)') as bb, 
    xmlnodes.idnode.value('(/XMLDoc/AAA/Value)[2]', 'varchar(255)') as dd, 
    Col3 = (SELECT ', '+xmlnodes.idnode.value('text()[1]', 'varchar(max)') 
       FROM @xml.nodes('/XMLDoc/AAA[position()>2]/Value') as xmlnodes(idnode) 
       FOR XML PATH(''), type).value('substring(text()[1], 3)', 'varchar(max)') 
from 
    @xml.nodes('/XMLDoc/AAA') as xmlnodes(idnode) 
Смежные вопросы