一个SQL存储过程的写法,获取部门下的用户

ymnets 2014-08-05 05:23:57
有表
Create table SysUser
(
[Id] [varchar](50) NOT NULL,
[UserName] [varchar](200) NOT NULL,
[DepId] [varchar](50) NOT NULL
)

Create table SysDep
(
Id varchar(50) not null,
Name varchar(50) not null,
ParentId varchar(50) not null
)

SysDep表是是一个树形结构的表
SysUser关键SysDep的ID

比如我要获取在某个部门下的所有用户,包括部门树下的用户,如
总公司
广州分公司
A用户
白云办事处
B用户
深圳分公司
C用户

用户A 是属于广州分公司的,用户B是属于白云办事处的,C是属于深圳分公司的

但选择总公司的时候要把他旗下的所有用户都获取到,即获取到A和B、C用户
当选择白云办事处时只获取到A,但选择广州分公司时候,也是获取到A和B,怎么获取用户列表
...全文
248 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
---涛声依旧--- 2014-08-09
  • 打赏
  • 举报
回复

    protected void doAjax(object sender, EventArgs e)
    {
        string searchStr = "";
        string Org_Pid = this.Org_Pid.Text.ToString().Trim();

        string sqlstrall;

        sqlstrall = "WITH CTE AS (\r\n"
                  + "select t.Org_No,t.Org_Id from HR_Org t (NOLOCK)\r\n"
                  + "where Org_id=" + Org_Pid + "\r\n"
                  + "UNION ALL \r\n"
                  + "SELECT t1.Org_No,t1.Org_Id FROM dbo.HR_Org t1 (NOLOCK)\r\n"
                  + "INNER JOIN CTE t2 ON t1.Org_Pid=t2.Org_Id\r\n"
                  + ")\r\n"
                  + "SELECT Org_No FROM cte";

        DbHelper db1 = DbFactory.CreateDb();
        db1.CmdType = CmdType.SQL;
        DataTable dt1 = db1.ExecDataTable(sqlstrall);

        string deptId = "";
        int j = dt1.Rows.Count;

        if (j > 0)
        {
            for (int i = 0; i < j; i++)
            {
                deptId += Utility.Quote(dt1.Rows[i]["Org_No"].ToString().Trim()) + ",";
            }

            deptId = deptId.Substring(0, deptId.Length - 1);

            searchStr = "e.PartID in(" + deptId + ")";
            setGridView(searchStr);
        }
        else
        {
            setGridView("e.Incumbency=1");
        }
    }
虫二二 2014-08-07
  • 打赏
  • 举报
回复
http://blog.csdn.net/fredrickhu/article/details/4573387 我直接给出链接吧
--小F-- 2014-08-06
  • 打赏
  • 举报
回复
搜索BOM广度深度排序 很多这样的例子。
专注or全面 2014-08-05
  • 打赏
  • 举报
回复


对结果集不过滤的话就是这种效果

parentid    id          Name                                               Sublevel
----------- ----------- -------------------------------------------------- -----------
1           2           中国                                                 0
2           3           中国/湖南                                              1
2           4           中国/广东                                              1
4           5           中国/广东/深圳                                           2
4           6           中国/广东/广州                                           2
4           7           中国/广东/珠海                                           2

(6 行受影响)


专注or全面 2014-08-05
  • 打赏
  • 举报
回复
--算是比较常用的CTE递归了,不知道下面的例子对楼主有用没



create table tb1
(
	parentid int,
	id int,
	Name nvarchar(20),
	Remark nvarchar(20)
)



insert into tb1 values (1,1,'世界','AAAAA')
insert into tb1 values (1,2,'中国','AAAAA')

insert into tb1 values (2,3,'湖南','AAAAA')
insert into tb1 values (2,4,'广东','AAAAA')



insert into tb1 values (4,5,'深圳','AAAAA')
insert into tb1 values (4,6,'广州','AAAAA')
insert into tb1 values (4,7,'珠海','AAAAA')


--查询某个节点及其子节点
with f as 
(
select parentid,id,cast(Name as varchar(max)) as Name,0 as   Sublevel   from tb1 where id=2--这里选择级别ID
union all
select a.parentid,a.id,CAST(b.Name+'/'+a.Name as varchar(max)) as Name,Sublevel+1 from tb1 as a inner join f as b on a.parentid=b.id
)
select * from f where   Sublevel =2

ymnets 2014-08-05
  • 打赏
  • 举报
回复
选择广州分公司时候,也是获取到A和B,因为白云是在广州下面的

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧