SQL服务器XML路径问题
SQL Server XML Path issue
我正在使用 SQL 服务器将数据加载为 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>
我的问题与此图像节点有关。我真正想要的是在没有图像节点
的情况下输出如下内容
<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>
但是当我尝试将其从查询中删除时出现此错误:
No column name was specified for column 3 of 'Items'
有没有办法实现预期的XML结构?
我相信这个 SQL 应该 return 你要找的东西:
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>
我正在使用 SQL 服务器将数据加载为 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>
我的问题与此图像节点有关。我真正想要的是在没有图像节点
的情况下输出如下内容 <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>
但是当我尝试将其从查询中删除时出现此错误:
No column name was specified for column 3 of 'Items'
有没有办法实现预期的XML结构?
我相信这个 SQL 应该 return 你要找的东西:
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>