邹老大的《开发与管理应用实例》8.2.5,要插入的节点为什么会有子节点呢
使终没弄明白,校验一个新插入的节点是否会造成循环,要检索该节点的子节点,看有没有等于该节点的父节点的节点。但新增的节点,怎么会有子节点呢,并且节点的编码应该都唯一呀。
附源代码:
--测试数据
CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
INSERT tb SELECT '001 ',NULL , '山东省 '
UNION ALL SELECT '002 ', '001 ', '烟台市 '
UNION ALL SELECT '004 ', '002 ', '招远市 '
UNION ALL SELECT '003 ', '001 ', '青岛市 '
UNION ALL SELECT '005 ',NULL , '四会市 '
UNION ALL SELECT '006 ', '005 ', '清远市 '
UNION ALL SELECT '007 ', '006 ', '小分市 '
GO
CREATE FUNCTION f_CheckCode(
@ID char(3), --要插入的节点编码
@PID char(3) --要插入的节点的上级编码
)RETURNS bit
AS
BEGIN
DECLARE @t TABLE(ID char(3),Level int,Flag tinyint)
DECLARE @level int
SET @level=0
INSERT @t SELECT ID,@level,CASE WHEN ID=@PID THEN 1 ELSE 0 END
FROM tb
WHERE PID=@ID
WHILE @@ROWCOUNT> 0
AND NOT EXISTS(SELECT * FROM @t WHERE Flag=1)
BEGIN
SET @level=@level+1
INSERT @t SELECT ID,@level,CASE WHEN ID=@PID THEN 1 ELSE 0 END
FROM tb a,@t b
WHERE a.PID=b.ID
AND b.Level=@level-1
END
RETURN((SELECT MAX(Flag) FROM @t))
END
------解决方案--------------------SELECT ID,@level,CASE WHEN ID=@PID THEN 1 ELSE 0 END
FROM tb a,@t b
WHERE a.PID=b.ID
AND b.Level=@level-1
这一段有点问题?
ID列没有指定表名`````