Sql 从asp.net中的数据库生成面包屑

Sql 从asp.net中的数据库生成面包屑,sql,sql-server,sql-server-2008,common-table-expression,Sql,Sql Server,Sql Server 2008,Common Table Expression,我需要根据pageID为任何页面生成面包屑。下面是基于MS Sql server的数据示例Sql脚本 CREATE TABLE PageMenu ([PageId] int, [PageName] varchar(5), path varchar(100), [PageInheritance] int) ; INSERT INTO PageMenu ([PageId], [PageName], [path], [PageInheritance]) VALUES (1,

我需要根据
pageID
为任何页面生成面包屑。下面是基于MS Sql server的数据示例
Sql脚本

CREATE TABLE PageMenu
    ([PageId] int, [PageName] varchar(5), path varchar(100), [PageInheritance] int)
;

INSERT INTO PageMenu
    ([PageId], [PageName], [path], [PageInheritance])
VALUES
    (1, 'Home', '/en/', 0),
    (2, 'About Us', '/en/about-us/', 0),
    (3, 'Our Mission', '/en/about-us/our-mission/', 2),
    (4, 'Our Vision', '/en/about-us/our-vision/', 2),
    (5, 'Media', '/en/media/', 0),
    (6, 'Press Release', '/en/media/press-releases/', 5),
    (7, 'Video Gallery', '/en/media/video-gallery/', 5),
    (8, 'Products', '/en/products/', 0),
    (9, 'Mens', '/en/products/mens/', 8),
    (10, 'Womens', '/en/products/womens/', 8),
    (11, 'Footwear', '/en/products/footwear/', 9),
    (12, 'Footwear', '/en/products/footwear/', 10),
    (13, 'Shoes', '/en/products/mens/footwear/shoes/', 9),
    (14, 'Sandals', '/en/products/mens/footwear/sandals/', 9),
    (15, 'Kids', '/en/products/kids/', 8)
;
我想创建一个基于CTE的存储过程,我想传递
pageid
,它应该以面包屑的形式递归返回页面的路径

假设我通过并
pageid=11
,那么它应该以下面的格式返回我下面的行

pageid_____PageName________Path
1          Home            /en/
8          Products        /en/products/
9          Mens            /en/products/mens/
11         Footwear        /en/products/mens/footwear/
基于上述结果集,我可以生成如下面包屑


家居>产品>男士>鞋类

这就是我找到的解决方案:

;WITH RecursiveTable (PageId, PageName,  Path, PageInheritance, Level)
AS(
   --Anchor
    SELECT      tt.PageId,  tt.PageName, tt.Path, tt.PageInheritance,  0 AS Level
    FROM pg_Menu AS tt
    WHERE PageId = 13
    UNION ALL
   --Recursion
    SELECT tt.PageId,  tt.PageName,  tt.Path, tt.PageInheritance, Level + 1
    FROM pg_Menu AS tt
    INNER JOIN RecursiveTable rt ON rt.PageInheritance = tt.PageId
)
SELECT * FROM RecursiveTable ORDER BY Level DESC
页面ID=13的结果

pageid_____PageName________Path
8          Products        /en/products/
9          Mens            /en/products/mens/
11         Footwear        /en/products/mens/footwear/
13         Shoes           /en/products/mens/footwear/shoes/

更新:Fiddle示例

“我试图在sql Fiddle上设置它,但失败了,出现了一些错误。”-这非常有用……第8行是从1继承的,而不是从0继承的。@HamletHakobyan,实际上
0
是根级菜单所有菜单,如
Home,Products,About us,Media
的页面继承为0。这就是它在我的数据库中的实际情况。@KnowledgeSeek请仔细查看。正如您所说,菜单产品是根目录。我不这么认为。家是你的根吗?或者它在根下?请添加您的解决方案作为答案,而不是将其包含在您的问题中。