不用spit函数在sqlserver中实现在一行中根据角色ID字符串显示该用户的所有角色功能

最近在工作中遇到一个需求,要求获取管理员用户名及此管理员的所有角色名,因为T_user的userroleid字段存的是角色ID串,这个需求如果在数据库中有split函数的话很容易实现。可是没有,而在正式服务器上若想创建个函数,那太难了,要写申请,还要经过漫长的流程,而且未必会允许你创建,直接放弃了这种想法。由于当时要的很急,而且管理员用户就10几个,当时为了赶时间,是这样解决的。首先查用户表:
不用spit函数在sqlserver中实现在一行中根据角色ID字符串显示该用户的所有角色功能
SELECT  username,userroleid FROM dbo.T_user WHERE userid IN (SELECT userid FROM dbo.T_role WHERE roleid =(SELECT TOP 1 id FROM dbo.T_UserRole WHERE rolename='管理员'))


然后获取每行的userroleid后,一个一个执行下面的语句,在用户角色表中查出来,再复制到想要的excel中。
SELECT rolename+','  FROM dbo.T_UserRole WHERE id IN (3,60,13,72,55,9) FOR XML PATH('') 


这种方法当然low。但是当时却是最快的方法。后来在不太忙的情况下,进行了各种尝试,觉得用虚拟表的话最有可能实现。但是实现太复杂,放弃了。
这两天又不太忙了,所以在网上找能够实现的方法。偶尔在csdn上看到了一篇文章:
最简洁的split函数实现方法:
SELECT B.id
FROM   ( SELECT    [value] = CONVERT(XML , '<v>' + REPLACE('1,2,3' , ',' , '</v><v>')
+ '</v>')
) A
OUTER APPLY ( SELECT  id = N.v.value('.' , 'varchar(100)')
FROM    A.[value].nodes('/v') N ( v )
) B 
没有过多的解释,但是经过我实验,是可行的。那我就根据这个看能否实现我要的功能。


经过反复修改,最终实现了这一功能。
SELECT  username,employeeid,usersapname,userroleid,
(
SELECT rolename+',' FROM dbo.T_UserRole  WHERE id IN (SELECT B.id
FROM   ( SELECT    [value] = CONVERT(XML , '<v>' + REPLACE(T_user.userroleid , ',' , '</v><v>')
+ '</v>')
) A
OUTER APPLY ( SELECT  id = N.v.value('.' , 'varchar(100)')
FROM    A.[value].nodes('/v') N ( v )
) B )
 FOR XML PATH('')
) 角色
 FROM dbo.T_user WHERE userid IN (SELECT userid FROM dbo.T_role WHERE roleid =(SELECT TOP 1 id FROM dbo.T_UserRole WHERE rolename='管理员'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值