最近在工作中遇到一个需求,要求获取管理员用户名及此管理员的所有角色名,因为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='管理员'))
不用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='管理员'))