2015-03-16 2 views
0

Я имею вопрос о сохранении данных из таблицы, которая, как показано ниже, чтобы XMLSQL сохранить данные в столбце 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 строки данных с тремя различными типами (х, уг), так что все эти три строк данных должны быть сохранены в одном XML-типе данных,> колонки с различным PersonId 2222 следует хранить в следующем row, он имеет только один тип (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 будет иметь только один тип.

Я могу сгенерировать одну строку данных в xml, но не смог ее сохранить в вышеуказанном формате.

+0

Можете ли вы предоставить соответствующий SQL, который вы уже пробовали, и описать, что о результатах не работает? – lheria

ответ

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