create
table
tb(id
varchar
(3) , pid
varchar
(3) ,
name
varchar
(10))
insert
into
tb
values
(
‘001‘
,
null
,
‘广东省‘
)
insert
into
tb
values
(
‘002‘
,
‘001‘
,
‘广州市‘
)
insert
into
tb
values
(
‘003‘
,
‘001‘
,
‘深圳市‘
)
insert
into
tb
values
(
‘004‘
,
‘002‘
,
‘天河区‘
)
insert
into
tb
values
(
‘005‘
,
‘003‘
,
‘罗湖区‘
)
insert
into
tb
values
(
‘006‘
,
‘003‘
,
‘福田区‘
)
insert
into
tb
values
(
‘007‘
,
‘003‘
,
‘宝安区‘
)
insert
into
tb
values
(
‘008‘
,
‘007‘
,
‘西乡镇‘
)
insert
into
tb
values
(
‘009‘
,
‘007‘
,
‘龙华镇‘
)
insert
into
tb
values
(
‘010‘
,
‘007‘
,
‘松岗镇‘
)
go
--查询指定节点及其所有子节点的函数
create
function
f_cid(@ID
varchar
(3))
returns
@t_level
table
(id
varchar
(3) ,
level
int
)
as
begin
declare
@
level
int
set
@
level
= 1
insert
into
@t_level
select
@id , @
level
while @@ROWCOUNT > 0
begin
set
@
level
= @
level
+ 1
insert
into
@t_level
select
a.id , @
level
from
tb a , @t_Level b
where
a.pid = b.id
and
b.
level
= @
level
- 1
end
return
end
go
--调用函数查询001(广东省)及其所有子节点
select
a.*
from
tb a , f_cid(
‘001‘
) b
where
a.id = b.id
order
by
a.id
/*
id pid
name
---- ---- ----------
001
NULL
广东省
002 001 广州市
003 001 深圳市
004 002 天河区
005 003 罗湖区
006 003 福田区
007 003 宝安区
008 007 西乡镇
009 007 龙华镇
010 007 松岗镇
(所影响的行数为 10 行)
*/
--调用函数查询002(广州市)及其所有子节点
select
a.*
from
tb a , f_cid(
‘002‘
) b
where
a.id = b.id
order
by
a.id
/*
id pid
name
---- ---- ----------
002 001 广州市
004 002 天河区
(所影响的行数为 2 行)
*/
--调用函数查询003(深圳市)及其所有子节点
select
a.*
from
tb a , f_cid(
‘003‘
) b
where
a.id = b.id
order
by
a.id
/*
id pid
name
---- ---- ----------
003 001 深圳市
005 003 罗湖区
006 003 福田区
007 003 宝安区
008 007 西乡镇
009 007 龙华镇
010 007 松岗镇
(所影响的行数为 7 行)
*/
drop
table
tb
drop
function
f_cid
原文:http://blog.csdn.net/fokle/article/details/18843091