SQL Server XML路径问题

问题描述 投票:1回答:1

我使用SQL Server将数据加载为xml。我在实际实现中使用了很少的表来加载数据。

因为更容易重现向临时表添加一些虚拟,如下所示

create table #T1(Id int, ItemName varchar(25))
create table #T2(ItemId int, ImagePath varchar(25))

Insert Into #T1
values (1, 'Item1'), (2, 'Item2')

Insert Into #T2
values (1, 'Path 1'), (1, 'Path 2'), (1, 'Path 3'),
       (2, 'Path 4'), (2, 'Path 5')

我正在编写如下查询(这是一个简化的版本来重现)

SELECT 
    'Some title' Title,
    (SELECT
         (SELECT * 
          FROM
              (SELECT 
                   *,
                   (SELECT TOP 2 ImagePath AS 'href'
                    FROM #T2 AS Image
                    WHERE Image.ItemId = ItinRow.Id
                    FOR XML PATH('Image'), ELEMENTS, TYPE) Images
                FROM 
                    #T1 ItinRow) AS ItinItemRow
          FOR XML PATH('Collections'), TYPE, ELEMENTS)
    FOR XML PATH(''), TYPE, ELEMENTS)                   
FROM 
    (SELECT *
     FROM #T1) ItinGroupPage
FOR XML PATH('Group'), ELEMENTS

这产生了这种XML结构

 <Group>
  <Title>Some title</Title>
  <Collections>
    <Id>1</Id>
    <ItemName>Item1</ItemName>
    <Images>
      <Image>
        <href>Path 1</href>
      </Image>
      <Image>
        <href>Path 2</href>
      </Image>
    </Images>
  </Collections>
  <Collections>
    <Id>2</Id>
    <ItemName>Item2</ItemName>
    <Images>
      <Image>
        <href>Path 4</href>
      </Image>
      <Image>
        <href>Path 5</href>
      </Image>
    </Images>
  </Collections>
</Group>

我的问题是这个图像节点。我真正想要的是在没有Images节点的情况下输出如下内容

 <Group>
  <Title>Some title</Title>
  <Collections>
    <Id>1</Id>
    <ItemName>Item1</ItemName>    
      <Image>
        <href>Path 1</href>
      </Image>
      <Image>
        <href>Path 2</href>
      </Image>
  </Collections>
  <Collections>
    <Id>2</Id>
    <ItemName>Item2</ItemName>
      <Image>
        <href>Path 4</href>
      </Image>
      <Image>
        <href>Path 5</href>
      </Image>
  </Collections>
</Group>

但是当我尝试从查询中删除它时,我收到此错误:

没有为“项目”的第3列指定列名

有没有办法实现预期的XML结构?

sql-server xml sql-server-2014 for-xml-path
1个回答
2
投票

我相信这个SQL应该返回你想要的东西:

SELECT
    'Some title' AS 'Title',
    (SELECT 
         Id,
         ItemName,
         (SELECT ImagePath AS 'Image/href'
          FROM #T2
          WHERE #T2.ItemId = #T1.Id
          FOR XML PATH(''), TYPE)
      FROM 
          #T1
      FOR XML PATH('Collections'), TYPE)
FOR XML PATH(''), ROOT('Groups')

在我的SQL Server 2016中,我从您提供的示例数据中获取此XML:

<Groups>
  <Title>Some title</Title>
  <Collections>
    <Id>1</Id>
    <ItemName>Item1</ItemName>
    <Image>
      <href>Path 1</href>
    </Image>
    <Image>
      <href>Path 2</href>
    </Image>
    <Image>
      <href>Path 3</href>
    </Image>
  </Collections>
  <Collections>
    <Id>2</Id>
    <ItemName>Item2</ItemName>
    <Image>
      <href>Path 4</href>
    </Image>
    <Image>
      <href>Path 5</href>
    </Image>
  </Collections>
</Groups>
© www.soinside.com 2019 - 2024. All rights reserved.