create table A
(
Nodeid1 varchar(5),
Nodeid2 varchar(5),
ParentId1 varchar(5),
parentId2 varchar(5)
)insert A select 'a001','abc','b001','abc'
insert A select 'b001','abc','c001','abc'
insert A select 'b001','abc','d001','abc'
insert A select 'd001','abc','f001','abc'
insert A select 'd001','abc','g001','abc'
insert A select 'd001','abc','h001','abc'
declare @T table(Nodeid1 varchar(5),ParentId1 varchar(5),lev int)
declare @Nodeid1 varchar(5)
declare @Nodeid2 varchar(5)
declare @lev int
set @lev=1
set @Nodeid1='a001'
set @Nodeid2='abc'
insert @T select Nodeid1,ParentId1,@lev from A where Nodeid1=@Nodeid1 and Nodeid2=@Nodeid2
while @@rowcount>0
begin
set @lev=@lev+1
insert @T select Nodeid1,ParentId1,@lev from A where Nodeid1 in (select ParentId1 from @T where lev=@lev-1)
end
select ParentId1 from @T
(
Nodeid1 varchar(5),
Nodeid2 varchar(5),
ParentId1 varchar(5),
parentId2 varchar(5)
)insert A select 'a001','abc','b001','abc'
insert A select 'b001','abc','c001','abc'
insert A select 'b001','abc','d001','abc'
insert A select 'd001','abc','f001','abc'
insert A select 'd001','abc','g001','abc'
insert A select 'd001','abc','h001','abc'
declare @T table(Nodeid1 varchar(5),ParentId1 varchar(5),lev int)
declare @Nodeid1 varchar(5)
declare @Nodeid2 varchar(5)
declare @lev int
set @lev=1
set @Nodeid1='a001'
set @Nodeid2='abc'
insert @T select Nodeid1,ParentId1,@lev from A where Nodeid1=@Nodeid1 and Nodeid2=@Nodeid2
while @@rowcount>0
begin
set @lev=@lev+1
insert @T select Nodeid1,ParentId1,@lev from A where Nodeid1 in (select ParentId1 from @T where lev=@lev-1)
end
select ParentId1 from @T
as
declare @T table(Nodeid1 varchar(5),ParentId1 varchar(5),lev int)
declare @lev int
set @lev=1
insert @T select Nodeid1,ParentId1,@lev from A where Nodeid1=@Nodeid1 and Nodeid2=@Nodeid2
while @@rowcount>0
begin
set @lev=@lev+1
insert @T select Nodeid1,ParentId1,@lev from A where Nodeid1 in (select ParentId1 from @T where lev=@lev-1)
end
select ParentId1 from @T
exec T_proc 'a001','abc'
create proc T_proc(@Nodeid1 varchar(5),@Nodeid2 varchar(5))
as
declare @T table(ParentId1 varchar(5),lev int)
declare @lev int
set @lev=1
insert @T select Nodeid1,0 from A where Nodeid1=@Nodeid1 and Nodeid2=@Nodeid2
insert @T select ParentId1,@lev from A where Nodeid1=@Nodeid1 and Nodeid2=@Nodeid2
while @@rowcount>0
begin
set @lev=@lev+1
insert @T select ParentId1,@lev from A where Nodeid1 in (select ParentId1 from @T where lev=@lev-1)
end
select ParentId1 from @T
exec T_proc 'a001','abc'
create table BOM(NodeId1 varchar(10),NodeId2 varchar(10),ParentId1 varchar(10),ParentId2 varchar(10))
insert into BOM select 'a001','abc','b001','abc'
insert into BOM select 'b001','abc','c001','abc'
insert into BOM select 'b001','abc','d001','abc'
insert into BOM select 'd001','abc','f001','abc'
insert into BOM select 'd001','abc','g001','abc'
insert into BOM select 'd001','abc','h001','abc'
go--创建用户定义函数
create function f_getParent(@NodeId1 VARCHAR(10),@NodeId2 VARCHAR(10))
returns @t table(NodeId1 varchar(10),NodeId2 varchar(10),ParentId1 varchar(10),ParentId2 varchar(10))
as
begin
insert into @t select * from BOM where NodeId1=@NodeId1 and NodeId2=@NodeId2
while @@rowcount<>0
begin
insert into @t
select
a.*
from
BOM a,@t b
where
a.NodeId1=b.ParentId1 and a.NodeId2=b.ParentId2
and
not exists(select 1 from @t where NodeId1=a.NodeId1 and NodeId2=a.NodeId2)
end
return
end
go--执行查询
select ParentId1 from dbo.f_getParent('a001','abc')
go--输出结果
/*
ParentId1
----------
b001
c001
d001
f001
g001
h001
*/--删除测试数据
drop function f_getParent
drop table BOM
returns @T table (ParentId1 varchar(5),lev int)
as
begin
declare @lev int
set @lev=1
insert @T select Nodeid1,0 from A where Nodeid1=@Nodeid1 and Nodeid2=@Nodeid2
insert @T select ParentId1,@lev from A where Nodeid1=@Nodeid1 and Nodeid2=@Nodeid2
while @@rowcount>0
begin
set @lev=@lev+1
insert @T select T.ParentId1,@lev from A T where exists (select 1 from @T where lev=@lev-1 and ParentId1=T.Nodeid1)
end
return
endselect ParentId1 from dbo.f_getParent('a001','abc')
--生成测试数据
create table BOM(NodeId1 varchar(10),NodeId2 varchar(10),ParentId1 varchar(10),ParentId2 varchar(10))
insert into BOM select 'a001','abc','b001','abc'
insert into BOM select 'b001','abc','c001','abc'
insert into BOM select 'b001','abc','d001','abc'
insert into BOM select 'd001','abc','f001','abc'
insert into BOM select 'd001','abc','g001','abc'
insert into BOM select 'd001','abc','h001','abc'
go--创建用户定义函数
create function f_getParent(@NodeId1 VARCHAR(10),@NodeId2 VARCHAR(10))
returns @t table(NodeId1 varchar(10),NodeId2 varchar(10),ParentId1 varchar(10),ParentId2 varchar(10),dep int)
as
begin
Declare @dep int
select @dep=1
insert into @t select NodeId1,NodeId2,ParentId1,ParentId2,@dep from BOM where NodeId1=@NodeId1 and NodeId2=@NodeId2
while @@rowcount<>0
begin
set @dep=@dep+1
insert into @t
select
a.NodeId1,a.NodeId2,a.ParentId1,a.ParentId2,@dep
from
BOM a,@t b
where
b.dep=@dep-1 and a.NodeId1=b.ParentId1 and a.NodeId2=b.ParentId2
end
return
end
go--执行查询
select parentid1 from dbo.f_getParent('a001','abc')
go