1、没有为变量@S_sbbm声明长度,导致变量类型默认为varchar(1)
-------------------------------------------------------------------------------------------------------------------
declare @S_sbbm varchar ==> declare @S_sbbm varchar(50)2、以下操作只能获得当前子编码的下一级编码中的一个,即便是能正确执行,也不会将当前自编码的所有下级子编码全部删除掉;而直接将当前子编码传给Sb_Del_Sb_All即可达到预期目的。
-------------------------------------------------------------------------------------------------------------------
declare @S_sbbm varchar
declare @S_sbFh int                 
select @S_sbbm=SBBM from SB_TZ_SBM where SBBM=@Zsbbm
exec Sb_Del_Sb_All @S_sbbm,@S_sbFh output==>declare @S_sbFh int                  
exec Sb_Del_Sb_All @Zsbbm,@S_sbFh output

解决方案 »

  1.   

    create proc DelNode
    @id int
    as
    declare @FilterID int --左
    declare @RightID int --右
    declare @i int 

    delete from TableMenu where aid=@id 
    --if exists(select aid,topic_id from TableMenu where topic_id=@id)
    select aid,topic_id from TableMenu where topic_id=@id
    set @i=@@rowcount --节点扇出数
    while @i>0
    begin
    select @FilterID=aid from TableMenu where topic_id=@id
    --递归
    exec DelNode @FilterID
    --select @RightID=aid from TableMenu where topic_id=@id
    --exec DelNode @RightID
    set @i=@i-1
    end GO/*
    已经测试成功,你稍微改动一下就能用
    */
    /*
    功能:删除一个节点下的所有节点,
    不仅是二叉节点(二叉树),任意树也行
    */
      

  2.   

    给你付上表结构,自己输入数据测试一下吧,有点不想写了,呵呵~~
    CREATE TABLE [TableMenu] (
    [aID] [int] NOT NULL ,
    [topic_id] [int] NOT NULL ,
    CONSTRAINT [PK_TableMenu] PRIMARY KEY  CLUSTERED 
    (
    [aID],
    [topic_id]
    )  ON [PRIMARY] 
    ) ON [PRIMARY]
    GO
      

  3.   

    谢谢lsp69(浪子神剑) 这种方法应该可以实现
    感觉还是少用游标好