我有一个产品类别表,其中包含以下字段:
cat_id(PK)
Cat_name
Cat_desc
Parent_Cat_Id
现在,当用户想要添加产品时,他应该能够从列表框中选择多个类别(多选的enabaled)。但是为了让用户知道类别的层次结构,我需要以下列样式显示它们:
父类别1
父类别1->子类别1
父类别1->子类别1->子子类别1
父类别1->子类别1->子子类别2
父类别1->子类别2
父类别2
...
我知道要实现这一点,我需要使用递归编程。但是我们如何通过存储过程来实现呢?那会更有效率,对吗?
提前感谢您的帮助。
答案 0 :(得分:2)
这就是你想要的。此存储过程使用“CTE”或“公用表表达式”。我不是他们的专业人士,但他们非常有用。绝对推荐查找它们。
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetRecursiveTest
AS
BEGIN
;WITh Tree (cat_id, cat_name, parent_cat_id, level, Sort) AS
(
SELECT cat_id, cat_name, parent_cat_id, 0 AS level,
CONVERT(varchar(255), cat_name) AS Sort
FROM RecursiveTest
WHERE parent_cat_id = 0
UNION ALL
SELECT RT.cat_id, RT.cat_name, RT.parent_cat_id, Parent.level + 1 AS level,
CONVERT(varchar(255), Parent.Sort + ' -> ' + RT.cat_name) AS Sort
FROM RecursiveTest RT
INNER JOIN Tree as Parent ON Parent.cat_id = RT.parent_cat_id
)
SELECT Sort FROM Tree
ORDER BY Sort
END
GO
实际上,如果您将最后一次选择更改为“selct * from tree”,您将获得有关层次结构的更多数据。
这是指向CTE's
的良好资源的链接答案 1 :(得分:0)
您使用的是Linq吗?
如果您使用LINQ,我建议添加一个新属性,该属性仅代表所有parentcategorys的类别,并在那里使用递归,因此您可以轻松地在asp.net中访问它