CREATE
TABLE
[
dbo
].
[
temptb
](
[
id
]
[
int
]
IDENTITY(
1,
1)
NOT
NULL,
[
pid
]
[
int
]
NULL,
[
name1
]
[
varchar
](
20) ,
[
name
]
[
nvarchar
](
50) ,
[
parentid
]
[
int
]
NULL,
CONSTRAINT
[
PK_temptb
]
PRIMARY
KEY
CLUSTERED
(
[
id
]
ASC
)
WITH (PAD_INDEX
=
OFF, STATISTICS_NORECOMPUTE
=
OFF, IGNORE_DUP_KEY
=
OFF, ALLOW_ROW_LOCKS
=
ON, ALLOW_PAGE_LOCKS
=
ON)
ON
[
PRIMARY
]
)
ON
[
PRIMARY
]
GO
/* 创建函数 根据节点id找出其所有父节点*/
create
function f_pid(
@id
int)
returns
@re
table(id
int,
level
int)
as
begin
declare
@l
int
set
@l
=
0
insert
@re
select
@id,
@l
while
@@rowcount
>
0
begin
set
@l
=
@l
+
1
insert
@re
select a.pid,
@l
from temptb a,
@re b
where a.id
=b.id
and b.
level
=
@l
-
1
and a.pid
<>
0
end
update
@re
set
level
=
@l
-
level
return
end
go
/* */
select a.
*,b.
level
from temptb a,f_pid(
7) b
where a.id
=b.id
order
by b.
level
go
/* 创建函数 根据节点id 找出所有子节点*/
create
function c_tree(
@initid
int)
/*定义函数c_tree,输入参数为初始节点id*/
returns
@t
table(id
int,name
varchar(
100),parentid
int,lev
INT,byid
int)
/*定义表t用来存放取出的数据*/
begin
declare
@i
int
/*标志递归级别*/
set
@i
=
1
insert
@t
select id,name,parentid,
@i ,byid
=
@initid
from temptb
where id
=
@initid
while
@@rowcount
<>
0
begin
set
@i
=
@i
+
1
insert
@t
select a.id,a.name,a.parentid,
@i,
@initid
from temptb
as a,
@t
as b
where b.id
=a.parentid
and b.lev
=
@i
-
1
end
return
END
/*在上面的函数中由于表变量使用了两次,性能很差 ,下面的性能要高些*/
create
function
[
dbo
].
[
UF_GetOwnerSKUNumber
]()
RETURNS
@b
table(id
int,byid
int)
BEGIN
DECLARE
@t
table(id
int,lev
INT,byid
int)
declare
@i
int
/*标志递归级别*/
set
@i
=
1
insert
@t
select c.id,
@i ,c.byid
from
[
temptb
] c
WITH (NOLOCK)
WHERE
[
pid
]
=
0
OR
[
parentid
]
IS
NULL
OR parentid
NOT
IN (
SELECT id
FROM
[
temptb
]
WHERE id
=c.id)
while
@@rowcount
<>
0
begin
set
@i
=
@i
+
1
insert
@b
SELECT a.id,b.byid
from
[
temptb
]
as a
WITH (NOLOCK) ,
@t
as b
where b.id
=a.parentid
and b.lev
=
@i
-
1
end
RETURN
END
select
*
from c_tree( )
/* 把所有行转换为一个字符串 */
DECLARE
@FileClassName
nvarchar(
max)
SET
@FileClassName
=
''
SELECT
@FileClassName
=+
@FileClassName
+
CONVERT(
varchar(
20),id)
+
'
,
'
FROM
[
temptb
] a
WHERE pid
=
0
SELECT
@FileClassName
AS a
本文转自高海东博客园博客,原文链接:http://www.cnblogs.com/ghd258/archive/2008/05/08/1188592.html,如需转载请自行联系原作者