日期:2014-05-18 浏览次数:20583 次
--生成测试数据
create table t1(id int,name char(1),parentid int)
insert into t1 select 1,'a',0
insert into t1 select 2,'b',0
insert into t1 select 3,'c',1
insert into t1 select 4,'d',1
insert into t1 select 5,'e',2
insert into t1 select 6,'f',2
insert into t1 select 7,'g',3
insert into t1 select 8,'h',3
go
--创建用户定义函数
create function f_getNum(@id int)
returns varchar(40)
as
begin
declare @ret varchar(4000),@pid int
set @ret = right('00'+rtrim(@id),2)
while exists(select 1 from t1 where id=@id and parentid!=0)
begin
select @pid=parentid from t1 where id=@id and parentid!=0
set @id = @pid
set @ret = right('00'+rtrim(@id),2)+@ret
end
return @ret
end
go
--执行查询
select
a.id,name,dbo.f_getNum(a.id) as path
from
t1 a
order by
dbo.f_getNum(a.id)
go
--输出结果:
/*
id name path
----------- ---- ----------------------------------------
1 a 01
3 c 0103
7 g 010307
8 h 010308
4 d 0104
2 b 02
5 e 0205
6 f 0206
*/
--删除测试数据
drop function f_getNum
drop table t1
------解决方案--------------------
create table dd(编号 varchar(10),上级编号 varchar(10),级别 int,路径 varchar(50))
insert into dd (编号 , 上级编号 , 级别)select '01',' ',0
insert into dd (编号 , 上级编号 , 级别)select '02','01',1
insert into dd (编号 , 上级编号 , 级别)select '03','02',2
create function wsp(@编号 varchar(10))
returns varchar(50)
as
begin
declare @路径 varchar(50),@上级编号 varchar(50)
set @路径=@编号
while exists(select * from dd where 编号=@编号 and 级别!=0)
begin
select @上级编号=上级编号 from dd where 编号=@编号
set @编号=@上级编号
set @路径 = @上级编号+@路径
end
return @路径
end
select dbo.wsp('03')
------解决方案--------------------
都是层层查,没有好办法