在SQL中将XML节点值转换为逗号分隔值

时间:2015-10-01 15:26:34

标签: sql sql-server

我正在尝试将XML节点值转换为逗号分隔值,但是要获得

  

关键字' SELECT'附近的语法不正确。    错误消息

declare @dataCodes XML = '<Root>
                    <List Value="120" />
                    <List Value="110" />
                </Root>';

DECLARE   @ConcatString VARCHAR(MAX)
SELECT   @ConcatString = COALESCE(@ConcatString + ', ', '') + Code FROM (SELECT T.Item.value('@Value[1]','VARCHAR(MAX)') as Code  FROM  @dataCodes.nodes('/Root/List') AS T(Item))
SELECT   @ConcatString AS Result
GO

我试图关注article,但不确定如何继续进行。任何建议都表示赞赏。

期望:

存储在变量中的逗号分隔值(&#39; 120,110&#39;)。

2 个答案:

答案 0 :(得分:4)

试试这个;

DECLARE @dataCodes XML = '<Root>
                    <List Value="120" />
                    <List Value="110" />
                </Root>';      

DECLARE @ConcatString VARCHAR(MAX)

SELECT @ConcatString = COALESCE(@ConcatString + ', ', '') + Code
FROM (
    SELECT T.Item.value('@Value[1]', 'VARCHAR(MAX)') AS Code
    FROM @dataCodes.nodes('/Root/List') AS T(Item)
    ) as TBL

SELECT @ConcatString AS Result
GO

您只需要为子SQL查询添加别名。

答案 1 :(得分:1)

对于未来的读者,可以使用通用语言将XML数据提取到数组,列表,向量和变量中,以更流畅的方式输出逗号分隔值。以下是使用OP的需求的开源解决方案,利用XPath

<强>的Python

import lxml.etree as ET

xml = '<Root>\
         <List Value="120" />\
         <List Value="110" />\
       </Root>'

dom = ET.fromstring(xml)
nodes = dom.xpath('//List/@Value')

data = []  # LIST
for elem in nodes:
    data.append(elem)

print((", ").join(data))

120, 110

<强> PHP

$xml = '<Root>
         <List Value="120" />
         <List Value="110" />
       </Root>';

$dom = simplexml_load_string($xml);    
$node = $dom->xpath('//List/@Value');

$data = [];   # Array
foreach ($node as $n){  
     $data[] = $n; 
}

echo implode(", ", $data);

120, 110

<强> - [R

library(XML)

xml = '<Root>
         <List Value="120" />
         <List Value="110" />
       </Root>'

doc<-xmlInternalTreeParse(xml)    
data <- xpathSApply(doc, "//List", xmlGetAttr, 'Value')  # LIST

print(paste(data, collapse = ', '))

120, 110