⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8.2.6 复制指定节点及其所有子节点到指定结点的处理示例(借鉴方式排序法).sql

📁 sqlserver 数据库编程的绝好脚本
💻 SQL
字号:
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,Level int)
AS
BEGIN
	IF @NewID IS NULL
		SELECT @NewID=COUNT(*) FROM TB
	ELSE
		SET @NewID=@NewID-1
	DECLARE @Level int
	SET @Level=1
	INSERT @t(OldID,PID,Level) SELECT ID,@PID,@Level
	FROM tb
	WHERE PID=@ID
	WHILE @@ROWCOUNT>0
	BEGIN
		UPDATE @t SET @NewID=@NewID+1,ID=@NewID
		WHERE Level=@Level
		SET @Level=@Level+1
		INSERT @t(OldID,PID,Level) SELECT a.ID,b.ID,@Level
		FROM tb a,@t b
		WHERE a.PID=b.OldID
			AND b.Level=@Level-1
	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           烟台市
9           5           青岛市
10          8           招远市
--*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -