根据登陆者id和用户类型,跨数据库关联三表,构建个人独立通迅录树
 creAddressTree

alter proc sp_creAddressTree @userid varchar(14),@usertype varchar(1) 
as 
begin 
declare @i int      --循环计数器 
declare @rowCount int 
declare @menu varchar(20) 
IF OBJECT_ID(N'tempdb..#tempTree', N'U') IS NOT NULL 
   drop table #tempTree 
CREATE TABLE #tempTree(id int identity(1,1) not null,pid int default((0)) not null ,menu varchar(20) not null,type int null,connectid varchar(14) null) 

if (@usertype = '2') 
   insert into #tempTree(pid,menu,type) values ( '0','部门联系人','0') 
-- 
--自定义组名 [作为父结点] 
set @i = 0 
select @rowCount= max (id) from  tb_usergroup 
while @i < @rowCount 
begin 
   if exists(select id from tb_usergroup where userid =@userid and id =@i+1
   begin 
     select @menu= groupname from tb_usergroup where id =@i+1 
     insert into #tempTree(pid,menu,type) values ( '0',@menu,'0') 
   end 
   set @i = @i+1 
end 
insert into #tempTree(pid,menu,type) values ( '0','添加',3) 

declare @pid int 
declare @connectid  int 
declare @connectname varchar(20) 

--部门联系人 
--查找对应部门,所有员工姓名作为结点 

if (@usertype = '2') --部门人员 
begin 
  set @i = 0 
  declare @depid int 
  select @rowCount = max(id) from  smartregionmanager..tb_epinfor 
  select @depid=branchid from smartregionmanager..tb_epinfor where epid = @userid 
  while @i <@rowCount 
  begin 
    if exists (select * from smartregionmanager..tb_epinfor where id =@i+1 and  epid <> @userid and branchid = @depid) 
      begin 
      select @connectid = id,@connectname =epname from smartregionmanager..tb_epinfor where id =@i+1 and  epid <> @userid and branchid = @depid 
      insert into #tempTree(pid,menu,type,connectid ) values ( '1',@connectname,'1',@connectid ) 
      end 
    set @i = @i+1 
  end 
end 

--用户自定义联系人 
set @i = 0 
select @rowCount= max (id) from  tb_addresslist 
while @i <@rowCount 
begin 
  if exists(select id from tb_addresslist where userid =@userid and id =@i+1
   begin 
     select @menu= groupname ,@connectid = id,@connectname =name from tb_addresslist where id =@i+1 
     select @pid = id from #tempTree where menu =@menu and pid ='0' 
     insert into #tempTree(pid,menu,type,connectid ) values ( @pid,@connectname,'2',@connectid ) 
   end 
   set @i = @i+1 
end 
select * from  #tempTree 
end 



////部分代码: 

  #region 创建导航树 (三层) 
    private void Navigation(string uid,int utype) 
    { 
        dataTable = GetCategorys(uid,utype);   ///取得本用户对应树的数据集 DT 
        tvgroup.Nodes.Clear(); 
        TreeNode rootNode = new TreeNode(); 
        rootNode.Text = "我的联系人"; 
        tvgroup.Nodes.Add(rootNode); 
        DataRow[] rowList = dataTable.Select("pid=0"); 
        if (rowList.Length <= 0) return; 
        foreach (DataRow row in rowList) 
        { 
            TreeNode chNode = new TreeNode(); 
            chNode.Text = row["menu"].ToString(); 
            chNode.Value = row["id"].ToString();   
            rootNode.ChildNodes .Add(chNode); 
            childNode (chNode ,chNode .Value );             
        } 
    } 
    private void childNode(TreeNode Node, string pid) 
    { 
        DataRow[] rowList = dataTable.Select("pid=" + pid); 
        if (rowList.Length <= 0) return; 
        foreach (DataRow row in rowList) 
        { 
            TreeNode node = new TreeNode(); 
            node.Text = row["menu"].ToString(); 
            node.Value = row["connectid"].ToString(); 
            Node.ChildNodes.Add(node); 
        } 
    } 
    #endregion 

    #region 展开当前结点,收缩其它结点 
    protected void tvgroup_TreeNodeExpanded(object sender, TreeNodeEventArgs e) 
    { 
        TreeNodeCollection ts = null; 
        if (e.Node.Parent == null) 
        { 
            ts = ((TreeView)sender).Nodes; 
        } 
        else 
            ts = e.Node.Parent.ChildNodes; 
        foreach (TreeNode node in ts) 
        { 
            if (node != e.Node) 
            { 
                node.Collapse(); 
            } 
        } 
    } 
    #endregion 

    #region 用户选择联系人 
    protected void tvgroup_SelectedNodeChanged(object sender, EventArgs e) 
    { 
        TreeNode tn = new TreeNode(); 
        tn = tvgroup.SelectedNode; 
        if (tn.ChildNodes.Count != 0)//如果是父亲结点 
        { 
            //tn.ToggleExpandState();//切换 
            tn.Collapse(); 
            tn.Selected = false; 
        } 
        else 
        {             
            tn.Selected = true; 
            if (tn.Value != null) 
            { 
                BindPersonal(tn.Value); ///绑定联系人信息 
            } 
        } 
    } 
    #endregion 

相关: 
  #region 递归创建嵌套树: 
    protected void Page_Load(object sender, EventArgs e) 
    { 
        //string userMenu = Request.Params["   "].ToString(); 
        dataTable  = GetCategorys("smartmanager",2); 
        tvgroup .Nodes.Clear(); 
        TreeNode rootNode = new TreeNode (); 
        rootNode.Text = "我的联系人"; 
        tvgroup .Nodes .Add(rootNode); 
        Navigation(rootNode, "0"); 
    } 
    private void Navigation(TreeNode Node,string pid) 
    { 
        DataRow[] rowList = dataTable.Select("pid=" + pid); 
        if (rowList.Length <= 0) return; 
        foreach (DataRow row in rowList) 
        { 
            TreeNode rootNode = new TreeNode(); 
            rootNode.Text = row["menu"].ToString(); 
            rootNode.Value = row["id"].ToString();   
            Node.ChildNodes .Add(rootNode); 
            Navigation (rootNode ,rootNode .Value );             
        } 
    } 
#endregion 

#tempTree 临时表中: 
------pid:   父节点 
------menu:菜单名 
------type:  [ 0 :组名; 1 :所在部门人员 ; 2 :自定义联系人; 3 :功能键 (+添加组/联系人) ] 
------connectid: [所有父节点取值为:Null , 第二层子节点取值为 联系人id ] 
  哈哈,有史以来最长的一个存储过程,构思了半天,花了四个小时终于搞定,  效率??