asp.net - 使用 SQL Server 存储过程创建层次结构树并以 xml 形式返回

标签 asp.net sql-server

我有一张下表。

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() 语法,您可以获得很大的灵 active - 您可以定义某些列以在 XML 节点上显示为属性,以及其他列可以用作 XML 元素。

到目前为止,我还没有找到解决方案,即对各种条目进行无限深的嵌套 - 在我的示例中,您有三层深度 - 不多也不少。您可以将其设置为四层或五层 - 但我不知道如何将其扩展到任何深度嵌套......

关于asp.net - 使用 SQL Server 存储过程创建层次结构树并以 xml 形式返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7612640/

相关文章:

sql-server - SQL索引查找

c# - 禁用动态图像按钮的回发

c# - 动态创建 HTML 按钮控件并在其中嵌套 i 标记

sql - 如何对 SQL 数据库进行实时更改

sql-server - 而不是插入触发器SQL

sql-server - T-SQL如何向用户授予角色

asp.net - ASP.NET 身份验证票证如何加密?

javascript - 为什么 jQuery 不能在已发布的网站上运行?

c# - 通过文本框将 SQL 数据插入 ASP.Net Web 应用程序中的表

SQL 创建数据库如果不存在,意外行为