El siguiente snippet sirve para obtener el listado de roles de una base de datos, con los usuarios que pertenecen a dicho rol:
SELECT
p.name rol,
p.principal_id id_rol,
m.name usuario,
m.principal_id id_usuario
FROM sys.database_role_members rm
INNER JOIN sys.database_principals p
ON rm.role_principal_id = p.principal_id
INNER JOIN sys.database_principals m
ON rm.member_principal_id = m.principal_id
ORDER BY p.name
La consulta devuelve un listado de roles y usuarios de la base de datos donde se ejecuta. Cabe mencionar que el listado contiene solamente los roles que están asignados a al menos un usuario (debido a los INNER JOIN), y que devuelve una fila por cada usuario y rol distinto. En este sentido, los usuarios que poseen más de un rol aparecerán repetidos en el listado. En otras palabras, si un usuario pertenece a N roles, entonces aparecerá repetido N veces en el listado, una vez por cada rol al que pertenece.
La consulta funciona (hasta donde yo he probado) en SQL Server 2005, 2008 y 2012.
Feliz día