SqlServer stuff + for xml path 用法(以权限角色管理为例讲解)

3 篇文章 0 订阅
2 篇文章 0 订阅

本例中用到的场景是希望把每个用户的角色以及权限都合并成一条进行展示
//单纯角色
select U.nameuname,D.name dname,R.name rname from [User] U,Department D,Role R,PowerP,UserToRole UR,RoleToPower RP

where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,D.name,R.name



//单纯权限

select U.nameuname,D.name dname,P.name pname from [User] U,Department D,Role R,PowerP,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,D.name,P.name

 

//合并角色

selectt1.usn,t1.userid,t1.uname,t1.dname,ability=STUFF((SELECT ','+t.rnameFROM(select U.name uname,D.name dname,R.name rname from [User] U,DepartmentD,Role R,Power P,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,D.name,R.name)t
WHERE uname=t1.uname  FOR XML PATH('')), 1, 1, '')
FROM (select U.sn usn,U.id userid,U.nameuname,R.name rname,D.name dname from [User] U,Department D,Role R,PowerP,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,R.name,D.name,U.sn,U.id)t1
group by t1.uname,t1.dname,t1.usn,t1.userid

 

//合并权限

selectt1.usn,t1.userid,t1.uname,t1.dname,ability=STUFF((SELECT ','+t.pnameFROM(select U.name uname,D.name dname,P.name pname from [User] U,DepartmentD,Role R,Power P,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,D.name,P.name)t
WHERE uname=t1.uname  FOR XML PATH('')), 1, 1, '')
FROM (select U.sn usn,U.id userid,U.nameuname,D.name dname,P.name pname from [User] U,Department D,Role R,PowerP,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,P.name,D.name,U.sn,U.id)t1

group by t1.uname,t1.dname,t1.usn,t1.userid



//将权限和角色做关联当做临时表再进行权限角色合并

 selectt1.usn,t1.userid,t1.uname,t1.dname,ability=STUFF((SELECT ','+t.pnameFROM(select U.name uname,D.name dname,P.name pname from [User] U,DepartmentD,Role R,Power P,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,D.name,P.name)t
WHERE uname=t1.uname  FOR XML PATH('')), 1, 1, '')
FROM (select U.sn usn,U.id userid,U.nameuname,D.name dname,P.name pname from [User] U,Department D,Role R,PowerP,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,P.name,D.name,U.sn,U.id)t1
group by t1.uname,t1.dname,t1.usn,t1.userid
  union
selectt1.usn,t1.userid,t1.uname,t1.dname,ability=STUFF((SELECT ','+t.rnameFROM(select U.name uname,D.name dname,R.name rname from [User] U,DepartmentD,Role R,Power P,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,D.name,R.name)t
WHERE uname=t1.uname  FOR XML PATH('')), 1, 1, '')
 FROM (select U.sn usn,U.id userid,U.nameuname,R.name rname,D.name dname from [User] U,Department D,Role R,PowerP,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,R.name,D.name,U.sn,U.id)t1
 group by t1.uname,t1.dname,t1.usn,t1.userid

//权限角色合并

selectT1.usn,T1.userid,T1.uname,T1.dname,PowerOrRole=STUFF((SELECT ','+T.ability FROM
(selectt1.usn,t1.userid,t1.uname,t1.dname,ability=STUFF((SELECT ','+t.pnameFROM(select U.name uname,D.name dname,P.name pname from [User] U,DepartmentD,Role R,Power P,UserToRole UR,RoleToPower RP
 where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,D.name,P.name)t
WHERE uname=t1.uname  FOR XML PATH('')), 1, 1, '')
FROM (select U.sn usn,U.id userid,U.nameuname,D.name dname,P.name pname from [User] U,Department D,Role R,PowerP,UserToRole UR,RoleToPower RP
 where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,P.name,D.name,U.sn,U.id)t1
group by t1.uname,t1.dname,t1.usn,t1.userid
union
selectt1.usn,t1.userid,t1.uname,t1.dname,ability=STUFF((SELECT ','+t.rnameFROM(select U.name uname,D.name dname,R.name rname from [User] U,DepartmentD,Role R,Power P,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,D.name,R.name)t
WHERE uname=t1.uname  FOR XML PATH('')), 1, 1, '')
FROM (select U.sn usn,U.id userid,U.nameuname,R.name rname,D.name dname from [User] U,Department D,Role R,PowerP,UserToRole UR,RoleToPower RP

 where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,R.name,D.name,U.sn,U.id)t1
group by t1.uname,t1.dname,t1.usn,t1.userid)T
WHERE uname=T1.uname  FOR XML PATH('')), 1, 1, '')
FROM (selectt1.usn,t1.userid,t1.uname,t1.dname,ability=STUFF((SELECT ','+t.pnameFROM(select U.name uname,D.name dname,P.name pname from [User] U,DepartmentD,Role R,Power P,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,D.name,P.name)t
WHERE uname=t1.uname  FOR XML PATH('')), 1, 1, '')
FROM (select U.sn usn,U.id userid,U.nameuname,D.name dname,P.name pname from [User] U,Department D,Role R,PowerP,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,P.name,D.name,U.sn,U.id)t1
group by t1.uname,t1.dname,t1.usn,t1.userid
union
selectt1.usn,t1.userid,t1.uname,t1.dname,ability=STUFF((SELECT ','+t.rnameFROM(select U.name uname,D.name dname,R.name rname from [User] U,DepartmentD,Role R,Power P,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,D.name,R.name)t
WHERE uname=t1.uname  FOR XML PATH('')), 1, 1, '')
FROM (select U.sn usn,U.id userid,U.nameuname,R.name rname,D.name dname from [User] U,Department D,Role R,PowerP,UserToRole UR,RoleToPower RP
where 1=1 and U.departmentId=D.id andU.id=UR.userId and R.id=UR.roleId and R.id=RP.roleId and P.id=RP.powerId groupby U.name,R.name,D.name,U.sn,U.id)t1
group byt1.uname,t1.dname,t1.usn,t1.userid)T1

group by T1.uname,T1.dname,T1.usn,T1.userid














  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值