WITH CTE
AS
(
SELECT ROW_NUMBER() OVER
(
PARTITION BY u2.UserID
ORDER BY MIN(u2.RoleAssignedDate)
) AS RowNum,
u2.UserID,
u2.RoleName
FROM @UserRole u2
GROUP BY u2.UserID,
u2.RoleName
)
SELECT DISTINCT u1.UserID,
SUBSTRING
(
(
SELECT ', ' + c.RoleName AS '*'
FROM CTE c
WHERE u1.UserID = c.UserID
ORDER BY c.RowNum
FOR XML PATH('')
), 3, 8000
) AS Roles
FROM @UserRole u1;
Should give the same result without the XQuery.