Asp.net 使用SQL Server存储过程创建分层树并作为xml重新调整
我有一张桌子Asp.net 使用SQL Server存储过程创建分层树并作为xml重新调整,asp.net,sql-server,Asp.net,Sql Server,我有一张桌子 CategoryId Category_name ParentId 1 Products 0 2 Property 0 3 Electronics 1 4 Computer 3 5 C
CategoryId Category_name ParentId
1 Products 0
2 Property 0
3 Electronics 1
4 Computer 3
5 Camera 3
6 Books 1
如何使用SQL Server CTE从中返回分层xml
提前感谢。我必须为我们的应用程序的位置做同样的事情,我通过迭代元素来完成。我想知道是否有一个简单的方法。如果您尝试一下,您可以实现某种程度的目标:
DECLARE @test TABLE (CategoryID INT, CatName VARCHAR(50), ParentID INT)
INSERT INTO @test
VALUES(1, 'Products', 0), (2, 'Property', 0), (3, 'Electronics', 1),
(4, 'Computer', 3), (5, 'Camera', 3), (6, 'Books', 1),
(7, 'Beach-front villa', 2), (8, 'DVD', 1)
;WITH Hierarchy AS
(
-- anchor
SELECT CategoryID, CatName, ParentID, 1 AS 'Level'
FROM @test
WHERE ParentID = 0
UNION ALL
-- recurse
SELECT t.CategoryID, t.CatName, t.ParentID, h.Level + 1 AS 'Level'
FROM Hierarchy h
INNER JOIN @test t ON t.ParentID = h.CategoryID
)
SELECT
h.CategoryID AS '@ID', h.CatName,
(SELECT
h2.CategoryID AS '@ID', h2.CatName AS '@Name',
(SELECT
h3.CategoryID AS '@ID', h3.CatName AS '@Name'
FROM Hierarchy h3
WHERE h3.ParentID = h2.CategoryID
FOR XML PATH('BottomLevelItem'), TYPE) AS 'SubItems'
FROM Hierarchy h2
WHERE h2.ParentID = h.CategoryID
FOR XML PATH('Item'), TYPE) AS 'Items'
FROM Hierarchy h
WHERE h.Level = 1
FOR XML PATH('TopLevelItem'), ROOT('AllItems')
这会产生如下结果:
<AllItems>
<TopLevelItem ID="1">
<CatName>Products</CatName>
<Items>
<Item ID="3" Name="Electronics">
<SubItems>
<BottomLevelItem ID="4" Name="Computer" />
<BottomLevelItem ID="5" Name="Camera" />
</SubItems>
</Item>
<Item ID="6" Name="Books" />
<Item ID="8" Name="DVD" />
</Items>
</TopLevelItem>
<TopLevelItem ID="2">
<CatName>Property</CatName>
<Items>
<Item ID="7" Name="Beach-front villa" />
</Items>
</TopLevelItem>
</AllItems>
产品
财产
使用SQL Server 2005及更高版本中的FOR XML PATH()
语法,您可以实现很大的灵活性—您可以定义某些列以在XML节点上显示为属性,其他列可以用作XML元素
到目前为止,我还并没有找到一个解决方案,那个就是对各种条目进行无限深的嵌套——在我的例子中,你们有三个层次——不多也不少。你可以做四到五个层次,但我不知道你怎么能把它扩展到任何嵌套深度