SQL SERVER 2000 遍历父子关系数据的表(二叉树)获得所有子节点 所有父节点及节点层数函数

 
---SQL SERVER 2000 遍历父子关系數據表(二叉树)获得所有子节点 所有父节点及节点层数函数
---Geovin Du 涂聚文
--建立測試環境
Create Table GeovinDu
([ID] Int,
 fatherID Int,
 [Name] Varchar(10)
)
Insert A Select 1,        0,       '中国'
Union All Select 2,        1,          '广东'
Union All Select 3,        1,          '北京'
Union All Select 4,        2,          '深圳特区'
Union All Select 5,        2,          '广州'
Union All Select 6,        4,          '罗湖'
Union All Select 7,        4,          '福田'
Union All Select 8,        7,           '华强北'
Union All Select 9,        0,  '美国'
Union All Select 10,       9,         '华盛顿州'
GO
--建立函數

--取字子节点
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetChildren]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[GetChildren]
GO
Create Function GetChildren(@ID Int)
Returns @Tree Table (ID Int, fatherID Int, Name Varchar(10))
As
Begin
Insert @Tree Select ID, fatherID, Name From GeovinDu Where fatherID = @ID
While @@Rowcount > 0
Insert @Tree Select A.ID, A.fatherID, A.Name From GeovinDu A Inner Join @Tree B On A.fatherID = B.ID And A.ID Not In (Select ID From @Tree)--- 
Return
End
GO

--取父节点

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[GetParent]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[GetParent]
GO
Create Function [dbo].[GetParent](@ID Int)
Returns @Tree Table (ID Int, fatherID Int, Name Varchar(10))
As
Begin
Insert @Tree Select ID, fatherID, Name From GeovinDu Where ID = @ID
While @@Rowcount > 0
Insert @Tree Select A.ID, A.fatherID, A.Name From GeovinDu A Inner Join @Tree B On A.ID = B.fatherID And A.ID Not In (Select ID From @Tree)
Return
End

---分为几级
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_getlevel]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_getlevel]
GO
create function f_getlevel(@id INT) returns int
as
begin
  declare @re_str as varchar(3)
  set @re_str = ''
  declare @level as int
  set @level = 1
  select @re_str = fatherID from GeovinDu where [ID] = @id 
  while exists (select 1 from GeovinDu where [ID] = @re_str)
    begin
      select @re_str = fatherID from GeovinDu where [ID] = @re_str
      set @level = @level + 1
    end
  return @level
end
go




--測試
SELECT * FROM GeovinDu
GO

Select * From dbo.GetChildren(4)

Select * From dbo.GetParent(4)
GO

select * , dbo.f_getlevel([ID])  'level' from A

drop function dbo.f_getlevel

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值