SQL Server 2000中的一例:
-----------------------------------------------------------------------------------
--生成测试数据
create table BOM(ID INT,PID INT,MSG VARCHAR(1000))
insert into BOM select 1,0,NULL
insert into BOM select 2,1,NULL
insert into BOM select 3,1,NULL
insert into BOM select 4,2,NULL
insert into BOM select 5,3,NULL
insert into BOM select 6,5,NULL
insert into BOM select 7,6,NULL
go--创建用户定义函数
create function f_getChild(@ID VARCHAR(10))
returns @t table(ID VARCHAR(10),PID VARCHAR(10),Level INT)
as
begin
    declare @i int,@ret varchar(8000)
    set @i = 1
    insert into @t select ID,PID,@i from BOM where PID = @ID
    
    while @@rowcount<>0
    begin
        set @i = @i + 1
        
        insert into @t 
        select 
            a.ID,a.PID,@i 
        from 
            BOM a,@t b 
        where 
            a.PID=b.ID and b.Level = @i-1
    end
    return
end
go--执行查询
select ID from dbo.f_getChild(3)
go--输出结果
/*
5
6
7
*/--删除测试数据
drop function f_getChild
drop table BOM

解决方案 »

  1.   

    protected void Page_Load(object sender, EventArgs e)
        {
            if (!this.IsPostBack)
            {
                this.NodeBind();//页面加载时解析数据库绑定TreeNode根节点
                this.DisPanel(true);//显示或不显示
            }
        }    #region//数据库连接字符串
        public void conString()
        {
            string conStr = "server=.;uid=sa;pwd=;database=Demo";
            con = new SqlConnection(conStr);
        }
        #endregion    #region//页面加载时绑定TreeNode根节点
        public void NodeBind()
        {
            this.tvadd.Nodes[0].ChildNodes.Clear();//清空TreeView中所有节点
            this.tvadd.Nodes[0].Expanded = true;//设置根节点为展开形式
            this.AddChildNode("NULL",this.tvadd.Nodes[0]);
        }
        #endregion    #region//递归解析数据库中节点并绑定在TreeView控件上
        /// <summary>
        /// 递归解析数据库中节点并绑定在TreeView控件上
        /// </summary>
        /// <param name="sqltj">要解析库这个节点归属于哪个父节点</param>
        /// <param name="tn">要添加下一级节点的父节点</param>
        public void AddChildNode(string sqltj,TreeNode tn)
        {
            string sql = "select * from AddNodes where ParentID";//查询该父节点下还有无子节点SQL语句
            if (sqltj == "NULL")
            {
                sql += " IS NULL";//也就是说是根节点下面的第一级子节点
            }
            else
            {
                sql += "=" + sqltj;//查询sqltj下有无子节点
            }
            
            DataTable dt = this.dtDataBind(sql);
            if (dt.Rows.Count == 0)//说明此节点下无子节点
            {
                return;//退出
            }
            else
            {
                for (int i = 0; i < dt.Rows.Count; i++)//循环DataTable表中子节点记录
                {
                    TreeNode tnchild = new TreeNode();//创建新的子节点
                    tnchild.Text = dt.Rows[i][1].ToString();//为新建子节点的文本赋值
                    tnchild.Value = dt.Rows[i][1].ToString();//为新建子节点的Value赋值
                    tnchild.Expanded = true;//设置为不展开节点
                    tn.ChildNodes.Add(tnchild);//添加此节点的下一级子节点
                    //递归调用,一直往下直到添加完这一级下面的所有子节点为止,再转到下一个父节点,并添加所有此父节点下面的所有子节点
                    //i代表DataTable表中循环记录,0代表取得这个记录的ID值,为下面继续检查这个ID下是否还有子目录
                    //tnchild递归传递给下一次调用此方法,此时如果这个节点下还有子节点,它便成为父节点,对它下面的子节点进行添加
                    this.AddChildNode(dt.Rows[i][0].ToString(),tnchild);
                }
            }
        }
        #endregion    #region//绑定DataTable表
        public DataTable dtDataBind(string sql)
        {
            this.conString();
            da = new SqlDataAdapter(sql,con);
            dt = new DataTable();
            da.Fill(dt);
            return dt;
        }
        #endregion
      

  2.   

    SQL 我还做不到 那么强只能用C#代码解决  怕是性能差了点先把所有 数据取出         按照 根结点ID 滤 表中数据  滤到数据 后  再遍例 它是子点就这样 递归着找吧
      

  3.   

    问题的关键是否再与抓叶子?
    exist搞个子查询不就能抓出来了