在asp.net中从数据库生成breadcrumb

时间:2014-08-31 07:53:37

标签: sql sql-server sql-server-2008 common-table-expression

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

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/

根据上面的结果集,我可以生成如下面的痕迹

Home > Products > Mens > Footwear

1 个答案:

答案 0 :(得分:1)

这是我找到的解决方案:

;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

PageID = 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/

更新:小提琴示例http://sqlfiddle.com/#!3/e4ce3/2