sql 怎么实现一个树形的存储过程

yyh 2010-08-02 10:14:15
父级A
|__子级A
|__子级B
父级B
|__子级C
|__子级D



通过存储过程返回一个列表; 列表如下

ID Name Parent_ID
1 父级A 0
2 子级A 1
3 子级B 1
4 父级B 0
5 子级C 4
6 子级D 4
...全文
133 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
andy_liucj 2010-08-02
  • 打赏
  • 举报
回复
[Quote=引用楼主 yangsisivsyinyuhui 的回复:]
父级A
|__子级A
|__子级B
父级B
|__子级C
|__子级D



通过存储过程返回一……
[/Quote]从什么得到这个结果?
cansum396 2010-08-02
  • 打赏
  • 举报
回复
--测试

CREATE TABLE [dbo].[BOM_DETAIL] (
[PKID] [int] ,--IDENTITY (1, 1) NOT NULL ,
[BOM_HEAD_PKID] [int] NOT NULL ,
[CHILDREN_ITEM] [int] NOT NULL ,
[QTY] [decimal](10, 0) NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[BOM_HEAD] (
[PKID] [int] ,--IDENTITY (1, 1) NOT NULL ,
[MASTER_ITEM] [int] NOT NULL ,
[QTY] [int] NOT NULL ,
[VER] [char] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[STATUS] [nvarchar] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
) ON [PRIMARY]

CREATE TABLE [dbo].[item] (
[item] [int] ,--IDENTITY (1, 1) NOT NULL ,
[brand] [nvarchar] (10) ,
[part_no] [nvarchar] (10)
) ON [PRIMARY]

insert item select 1 , 'A ' , 'A1 '
union all select 2 , 'B ' , 'AAAAA '
union all select 3 , 'A ' , 'AD '
union all select 4 , 'A ' , 'SS '
union all select 5 , 'C ' , '123 '
union all select 6 , 'C ' , 'AAADSFD '
union all select 7 , 'D ' , 'D22 '
union all select 8 , 'C ' , 'DDDD512 '
union all select 9 , 'A ' , 'AA3223 '
union all select 10, 'DD ', '356 '

insert BOM_HEAD select 1,1,1,1, '使用中 '
union all select 2,3,1,1, '使用中 '
union all select 3,1,1,2, '停用 '
union all select 4,6,1,1, '使用中 '
union all select 5,8,1,1, '使用中 '
union all select 6,2,1,1, '使用中 ' --加一条数据

insert BOM_DETAIL select 1, 1,2 ,1
union all select 2, 1,6 ,2
union all select 3, 2,1 ,1
union all select 4, 3,4 ,1
union all select 5, 3,5 ,1
union all select 6, 4,7 ,1
union all select 7, 4,8 ,1
union all select 8, 5,9 ,1
union all select 9, 5,10,1
union all select 10,6,6, 1 --加一条数据
go

--展开bom查询的函数
create function f_bom(
@item int
)returns @r table(
item int,
brand nvarchar(10),
part_no nvarchar(10),
QTY decimal(10,0), --取自BOM_DETAIL
level int, --层次
sid varchar(8000) --排序字段,通过这个来排序,可以体现出树形的层次
)
as
begin
declare @l int

set @l=0
insert @r select @item,brand,part_no,0,@l,right(10000+item,4)
from item
where item=@item
while @@rowcount> 0
begin
set @l=@l+1
insert @r select i.item,i.brand,i.part_no,d.qty,@l,r.sid+ ', '+right(10000+i.item,4)
from item i,BOM_HEAD h,BOM_DETAIL d,@r r
where r.level=@l-1
and r.item=h.MASTER_ITEM
and h.STATUS= '使用中 '
and h.PKID=d.BOM_HEAD_PKID
and d.CHILDREN_ITEM=i.item
end
return
end
go

--调用函数得到查询结果
select 层次=space(level*2)+ '├─ '
,item,brand,part_no,qty
from f_bom(1)
order by sid

go
drop table item,BOM_HEAD,BOM_DETAIL
drop function f_bom

/*--测试结果

层次 item brand part_no qty
-------------- ---------- ---------- ---------- -------
├─ 1 A A1 0
├─ 2 B AAAAA 1
├─ 6 C AAADSFD 1
├─ 7 D D22 1
├─ 8 C DDDD512 1
├─ 9 A AA3223 1
├─ 10 DD 356 1
├─ 6 C AAADSFD 2
├─ 7 D D22 1
├─ 8 C DDDD512 1
├─ 9 A AA3223 1
├─ 10 DD 356 1

(所影响的行数为 12 行)
--*/

原创:邹建
whjk1234bo 2010-08-02
  • 打赏
  • 举报
回复
学习学习,帮顶!
yyh 2010-08-02
  • 打赏
  • 举报
回复
自己做沙发。。
IHandler 2010-08-02
  • 打赏
  • 举报
回复
把数据一次取出来递归绑定

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧