在SQL的樹型結構中,很多時候,知道某一節點的值,需要查找該節點的所有子節點(包括多級)的功能,這時就需要用到如下的用戶自定義函數.
表結構如下:
| ID | int |
| Dep_Type | int |
| Dep_Code | varchar(50) |
| Dep_Name | varchar(50) |
| Dep_Dian | int |
| Dep_FathID | int |
| Dep_Opera | varchar(50) |
| Dep_Status | int |
| Dep_AddTime | datetime |
用戶自定義函數如下:
create function f_getChild(@ID VARCHAR(10))
returns @t table(ID VARCHAR(10),PID VARCHAR(10),Level INT)
as
begin
declare @i int,@ret varchar(8000)
set @i = 1
insert into @t select ID,Dep_FathID,@i from H_Dep_Info where Dep_FathID = @ID
while @@rowcount<>0
begin
set @i = @i + 1
insert into @t select a.ID,a.Dep_FathID,@i from H_Dep_Info a,@t b where a.Dep_FathID=b.ID and b.Level = @i-1
end
return
end
執行操作如下:
select ID from f_getChild(1)
返回值就是所有的子節點
查找父節點的函數如下:
CREATE FUNCTION [f_getParent](@id int)
RETURNS @re TABLE(id int,pid int,level int)
AS
begin
declare @level int
set @level = 1
declare @pid int
select @pid = pid from tb where id = @id
insert @re
select id,pid,@level from tb where id = @pid
while @@rowcount > 0
begin
set @level = @level + 1
select @pid = pid from tb where id = @pid
insert @re
select id,pid,@level from tb where id = @pid
end
return
end
執行操作如下:
select * from f_getParent(8)
返回的列有id,pid,level
其中id就是8的父節點,pid就是id的父節點,level就是級數(表示這個id是8的第幾級你節點)
