SQL使用分组和嵌套将数据保存到XML列中

时间:2015-03-16 22:22:30

标签: sql sql-server xml sql-server-2008 sqlxml

我遇到的问题是从表格中保存数据,如下面的xml

ID  personID  Type   Name   category  value
1     1234    xtype   John     abc      200
2     1234    ytype   John     xyz      230
3     1234    ztype   John     ccc      220
4     2222    xtype   Jim      abc      200

我需要在xml中保存以上数据 条件。

  

personId 1234的数据具有3行数据,具有三种不同类型(x,yz),因此所有这三行数据应保存在一个xml数据类型中,>具有不同personID 2222的列应存储在下一行中,它只有一个类型(x),因此它只有一次。

必需的xml示例

<Data>
<PersonID>1234</PersonID>
<SpecifiedType>
<Type>xtype</Type>
<Name>John</Name>
<category>abc</category>
<value>200</Value>
</SpecifiedType>
<SpecifiedType>
<Type>Ytype</Type>
<Name>John</Name>
<category>xyz</category>
<value>230</Value>
</SpecifiedType>
 <SpecifiedType>
 <Type>Ztype</Type>
 <Name>John</Name>
 <category>ccc</category>
 <value>220</Value>
 </SpecifiedType>
 </Data>

根据应分组的类型,有时personID只有一个Type。

我能够将一行数据生成到xml中,但无法以上述格式存储它。

1 个答案:

答案 0 :(得分:0)

您可以使用FOR XML执行此操作。为了获得你想要的分组和结构涉及几层,但这并不太难;

declare @t table (ID int, PersonID int, Type varchar(10), Name varchar(10), category varchar(10), value int)
insert @t values
    (1, 1234, 'xtype', 'John', 'abc', 200),
    (2, 1234, 'ytype', 'John', 'xyz', 230),
    (3, 1234, 'ztype', 'John', 'ccc', 220),
    (4, 2222, 'xtype', 'Jim', 'abc', 200)

; with cte
as (
    select distinct PersonID from @t
)
select
    (select
        PersonID,
        (select
             Type,
             Name,
             category,
             value
         from
             @t t
         where
             t.PersonID = cteInner.PersonID
         for xml path('SpecifiedType'), type ) 
    from
        cte cteInner
    where
        cteInner.PersonID = cteOuter.PersonID
    for xml path(''), type, root('data') )
from 
    cte cteOuter