将常见的sql列值转换为xml节点

时间:2014-09-26 18:20:44

标签: sql xml sql-server-2012

假设我有一个这样的数据集:

|Group|Value|
|-----|-----|
|  A  | 123 |
|-----|-----|
|  A  | 234 |
|-----|-----|
|  B  | 123 |
|-----|-----|

并希望将其转换为XML:

<Groups>
    <Group Name="A">
         <Values>
              <Value>123</Value>
              <Value>234</Value>   
         </Values> 
    </Group>  
    <Group Name="B">
         <Values>
              <Value>123</Value>
         </Values> 
    </Group>    
</Groups>

我尝试过使用以下内容:

   SELECT  
         [Group] AS "@Name"
        ,[Value] AS "Group/Values/Value"
    FROM [Tablename]
    FOR XML PATH('Group'), ROOT('Groups')

但我得到的是:

<Groups>
    <Group Name="A">
         <Values>
              <Value>123</Value> 
         </Values> 
    </Group>  
    <Group Name="A">
         <Values>
              <Value>234</Value>   
         </Values> 
    </Group>  
    <Group Name="B">
         <Values>
              <Value>123</Value>
         </Values> 
    </Group>    
</Groups>

如何根据第一列中的数据组合这些节点?

1 个答案:

答案 0 :(得分:2)

测试数据

DECLARE @TABLE TABLE([Group] VARCHAR(10), Value INT)
INSERT INTO @TABLE VALUES 
('A',123),
('A',234),
('B',123)

查询

SELECT   t.[Group] AS [@Name]

      ,(SELECT [Value] AS [Value]
        FROM @TABLE
        WHERE [Group] = t.[Group]
        FOR XML PATH(''), ROOT('Values') ,TYPE)
FROM @TABLE t
GROUP BY t.[Group]
FOR XML PATH('Group'), ROOT('Groups')

结果

<Groups>
  <Group Name="A">
        <Values>
              <Value>123</Value>
              <Value>234</Value>
        </Values>
  </Group>
  <Group Name="B">
        <Values>
             <Value>123</Value>
        </Values>
  </Group>
</Groups>