Sql返回结果为xml

时间:2017-09-12 09:17:40

标签: sql sql-server xml

鉴于此数据:

FName     Lname   ApartmentNumber
-----------------------------------
David    Shumer      1
John     Deer        1
Mark     Ratz        2
Steven   Styer       2

我想将其作为xml返回,所以我这样做了:

select * from Table1 
for xml raw('person'), root('PeopleInApartment'), elements

我得到了这个结果

<PeopleInApartment>
  <Person>
    <FName>David</FName>
    <LName>Shumer</LName>
    <ApartmentNumber>1</ApartmentNumber>
  </Person>
  <Person>
    <FName>John</FName>
    <LName>Deer</LName>
    <ApartmentNumber>1</ApartmentNumber>
  </Person>
  <Person>
    <FName>Mark</FName>
    <LName>Ratz</LName>
    <ApartmentNumber>2</ApartmentNumber>
  </Person>
  <Person>
    <FName>Steven</FName>
    <LName>Styer</LName>
    <ApartmentNumber>2</ApartmentNumber>
  </Person>
</PeopleInApartment>

是否可以按公寓对人进行分组,结果看起来像这样?:

<Apartments>
    <PeopleInApartment>
      <Person>
        <FName>David</FName>
        <LName>Shumer</LName>
        <ApartmentNumber>1</ApartmentNumber>
      </Person>
      <Person>
        <FName>John</FName>
        <LName>Deer</LName>
        <ApartmentNumber>1</ApartmentNumber>
      </Person>
    </PeopleInApartment>
    <PeopleInApartment>
      <Person>
        <FName>Mark</FName>
        <LName>Ratz</LName>
        <ApartmentNumber>2</ApartmentNumber>
      </Person>
      <Person>
        <FName>Steven</FName>
        <LName>Styer</LName>
        <ApartmentNumber>2</ApartmentNumber>
      </Person>
    </PeopleInApartment>
</Apartments>

3 个答案:

答案 0 :(得分:1)

Sql解决方案。注意子查询必须仅依赖于GROUP BY中的外部列,特别是t1.ApartmentNumber

select t1.ApartmentNumber
  , (select t2.FName, t2.Lname
     from Table1  t2
     where t2.ApartmentNumber = t1.ApartmentNumber
     for xml path('Person'), type 
     ) as  PeopleInApartment
from Table1  t1
group by ApartmentNumber
for xml path('Apartment'), root('Apartments'), elements

返回数据公寓 - 明智的

<Apartments>
    <Apartment>
        <ApartmentNumber>1</ApartmentNumber>
        <PeopleInApartment>
            <Person>
                <FName>David </FName>
                <Lname>Shumer</Lname>
            </Person>
            <Person>
                <FName>John  </FName>
                <Lname>Deer  </Lname>
            </Person>
        </PeopleInApartment>
    </Apartment>
    <Apartment>
        <ApartmentNumber>2</ApartmentNumber>
        <PeopleInApartment>
            <Person>
                <FName>Mark  </FName>
                <Lname>Ratz  </Lname>
            </Person>
            <Person>
                <FName>Steven</FName>
                <Lname>Styer </Lname>
            </Person>
        </PeopleInApartment>
    </Apartment>
</Apartments>

答案 1 :(得分:0)

使用xml linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication3
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            XElement apartments = new XElement("Apartments");

            var groups = doc.Descendants("Person")
                .GroupBy(x => (int)x.Element("ApartmentNumber"))
                .ToList();

            foreach (var group in groups)
            {
                XElement peopleInApartment = new XElement("PeopleInApartment", group);
                apartments.Add(peopleInApartment);
            }
        } 
    }
}

答案 2 :(得分:0)

请检查下面:

 select 
   (select t2.FName, t2.Lname, t1.ApartmentNumber
     from #TEMP  t2
     where t2.ApartmentNumber = t1.ApartmentNumber
     for xml path('Person'), type 
     ) as  PeopleInApartment
from #TEMP  t1
group by ApartmentNumber
for xml path(''), root ('Apartments')