CREATE TABLE tb(ID int,PID int,Name nvarchar(10))
INSERT tb SELECT 1,NULL,'山东省'
UNION ALL SELECT 2,1 ,'烟台市'
UNION ALL SELECT 4,2 ,'招远市'
UNION ALL SELECT 3,1 ,'青岛市'
UNION ALL SELECT 5,NULL,'四会市'
UNION ALL SELECT 6,5 ,'清远市'
UNION ALL SELECT 7,6 ,'小分市'
GO
--节点复制处理函数
CREATE FUNCTION f_CopyNode(
@ID int, --复制此节点下的所有子节点
@PID int, --将@ID下的所有子节点复制到此节点下面
@NewID int=NULL --新编码的开始值,如果指定为NULL,则为表中的最大编码+1
)RETURNS @t TABLE(OldID int,ID int,PID int)
AS
BEGIN
IF @NewID IS NULL
SELECT @NewID=COUNT(*)+1 FROM TB
DECLARE tb CURSOR LOCAL
FOR
SELECT ID FROM tb
WHERE PID=@ID
OPEN TB
FETCH tb INTO @ID
WHILE @@FETCH_STATUS=0
BEGIN
INSERT @t VALUES(@ID,@NewID,@PID)
SET @NewID=@NewID+1
IF @@NESTLEVEL<32 --如果递归层数未超过32层(递归最大允许32层)
BEGIN
--递归查找当前节点的子节点
DECLARE @PID1 int
SET @PID1=@NewID-1
INSERT @t SELECT * FROM f_CopyNode(@ID,@PID1,@NewID)
SET @NewID=@NewID+@@ROWCOUNT --排序号加上子节点个数
END
FETCH tb INTO @ID
END
RETURN
END
GO
--调用函数将节点1下面的所有子节点复制到节点5下面
INSERT tb(ID,PID,Name)
SELECT a.ID,a.PID,b.Name
FROM f_CopyNode(1,5,DEFAULT) a,tb b
WHERE a.OldID=b.ID
SELECT * FROM tb
/*--结果
ID PID Name
---------------- ----------------- ----------
1 NULL 山东省
2 1 烟台市
4 2 招远市
3 1 青岛市
5 NULL 四会市
6 5 清远市
7 6 小分市
8 5 烟台市
10 5 青岛市
9 8 招远市
--*/
INSERT tb SELECT 1,NULL,'山东省'
UNION ALL SELECT 2,1 ,'烟台市'
UNION ALL SELECT 4,2 ,'招远市'
UNION ALL SELECT 3,1 ,'青岛市'
UNION ALL SELECT 5,NULL,'四会市'
UNION ALL SELECT 6,5 ,'清远市'
UNION ALL SELECT 7,6 ,'小分市'
GO
--节点复制处理函数
CREATE FUNCTION f_CopyNode(
@ID int, --复制此节点下的所有子节点
@PID int, --将@ID下的所有子节点复制到此节点下面
@NewID int=NULL --新编码的开始值,如果指定为NULL,则为表中的最大编码+1
)RETURNS @t TABLE(OldID int,ID int,PID int)
AS
BEGIN
IF @NewID IS NULL
SELECT @NewID=COUNT(*)+1 FROM TB
DECLARE tb CURSOR LOCAL
FOR
SELECT ID FROM tb
WHERE PID=@ID
OPEN TB
FETCH tb INTO @ID
WHILE @@FETCH_STATUS=0
BEGIN
INSERT @t VALUES(@ID,@NewID,@PID)
SET @NewID=@NewID+1
IF @@NESTLEVEL<32 --如果递归层数未超过32层(递归最大允许32层)
BEGIN
--递归查找当前节点的子节点
DECLARE @PID1 int
SET @PID1=@NewID-1
INSERT @t SELECT * FROM f_CopyNode(@ID,@PID1,@NewID)
SET @NewID=@NewID+@@ROWCOUNT --排序号加上子节点个数
END
FETCH tb INTO @ID
END
RETURN
END
GO
--调用函数将节点1下面的所有子节点复制到节点5下面
INSERT tb(ID,PID,Name)
SELECT a.ID,a.PID,b.Name
FROM f_CopyNode(1,5,DEFAULT) a,tb b
WHERE a.OldID=b.ID
SELECT * FROM tb
/*--结果
ID PID Name
---------------- ----------------- ----------
1 NULL 山东省
2 1 烟台市
4 2 招远市
3 1 青岛市
5 NULL 四会市
6 5 清远市
7 6 小分市
8 5 烟台市
10 5 青岛市
9 8 招远市
--*/