使用FOR XML以xml格式选择数据

时间:2016-08-05 11:53:05

标签: sql-server xml sql-server-2012 for-xml

我正在编写查询以选择xml格式的一些列。

样品

我有以下数据

Create Table #Master(Id int, Name varchar(100))

Insert Into #Master
Values(1,'Item1'),(2,'Item2')


Create Table #Sub(SubId int,MasteId int, SubName varchar(100))

Insert Into #Sub
Values(1,1,'SubItem1'),(2,1,'SubItem2')

目前编写查询如下

Select *
From #Master as Main
FOR XML AUTO, ROOT ('ItemGroup'), ELEMENTS  XSINIL;

将xml拉到下面

<ItemGroup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Main>
    <Id>1</Id>
    <Name>Item1</Name>
  </Main>
  <Main>
    <Id>2</Id>
    <Name>Item2</Name>
  </Main>
</ItemGroup>

但是我想使用链接#Master和#Sub将子项目放在每个主项目的单独注释中,这样它将生成如下所示

<ItemGroup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Main>
    <Id>1</Id>
    <Name>Item1</Name>
    <SubItems>
      <subitem>
        <subid>1</subid>
        <masterid>1</masterid>
        <subname>SubItem1</subname>
      </subitem>
      <subitem>
        <subid>2</subid>
        <masterid>1</masterid>
        <subname>SubItem2</subname>
      </subitem>
    </SubItems>
  </Main>
  <Main>
    <Id>2</Id>
    <Name>Item2</Name>
  </Main>
</ItemGroup>

有什么方法可以实现这个目标吗?

2 个答案:

答案 0 :(得分:1)

SELECT
    *,
    (
        SELECT *
        FROM #Sub AS subitem
        WHERE subitem.MasteId = Main.Id
        FOR XML AUTO, ELEMENTS, TYPE 
    ) AS SubItems
From #Master as Main
FOR XML AUTO, ROOT ('ItemGroup'), ELEMENTS XSINIL;

答案 1 :(得分:1)

试试这个,

Select *, (Select *
            From #Sub as s
            WHERE s.MasteId = Main.Id
            FOR XML PATH('subitem'), TYPE ) SubItems
From #Master as Main
FOR XML AUTO, ROOT ('ItemGroup'), ELEMENTS  XSINIL;