日期:2014-05-18 浏览次数:20478 次
--生成测试数据 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')
------解决方案--------------------
都是层层查,没有好办法