表SQL的xml名称/值

时间:2014-07-22 15:02:27

标签: xml tsql

我有下表

Id | XML
1    XML1
2    XML2
3    XML3

每个XML都有结构:

<aaa>
  <row name="a" value="1" />
  <row name="b" value="2" />
  <row name="c" value="3" />
</aaa>

<aaa>
  <row name="a" value="3" />
  <row name="b" value="4" />
  <row name="c" value="5" />
</aaa>

<aaa>
  <row name="a" value="10" />
  <row name="b" value="20" />
  <row name="c" value="30" />
</aaa>

我想获得输出表:

a | b | c
1   2   3
3   4   5
10  20  30

我在TSQL中写过但我无法从每个xml中获取完整的参数

SELECT [Id], [XML] FROM table


SELECT
[XML].value('(aaa/row//@name)[1]','varchar(20)') AS 'NAME',
[XML].value('(aaa/row//@value)[1]','varchar(20)') AS 'VALUE'
 FROM table

2 个答案:

答案 0 :(得分:0)

以下是您在一个变量中使用XML的示例以及用于选择字段的结果代码。

DECLARE @xmlIN XML = '<TableData>
    <aaa>
      <row name="a" value="1" />
      <row name="b" value="2" />
      <row name="c" value="3" />
</aaa>
<aaa>
  <row name="a" value="3" />
  <row name="b" value="4" />
  <row name="c" value="5" />
</aaa>
<aaa>
  <row name="a" value="10" />
  <row name="b" value="20" />
  <row name="c" value="30" />
</aaa>
</TableData>'

SELECT t.col.value('@name', 'VARCHAR(25)') [name],  
t.col.value('@value',  'VARCHAR(25)') [Value]
FROM    @xmlIn.nodes('//TableData/aaa/row') AS t (col)

然后以您描述的格式获取数据,您将不得不做某种PIVOT。

答案 1 :(得分:0)

这应该有效:

SELECT
[XML].value('(aaa/row/@value)[1]','varchar(20)') AS a,
[XML].value('(aaa/row/@value)[2]','varchar(20)') AS b,
[XML].value('(aaa/row/@value)[3]','varchar(20)') AS c
FROM table