日期:2014-05-18  浏览次数:20423 次

邹老大的《开发与管理应用实例》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列没有指定表名`````