Я считаю, что проблема в структуре вашего CTE.Первая половина запроса Union должна представлять родителя, а вторая должна возвращать потомков.То есть вы идете по иерархии, а не по ней.Таким образом, я бы изменил предложение On во второй половине запроса Union на:
aspnet_Roles_CTE.RoleId = aspnet_Roles.ParentRoleId
.
Edit
Некоторые примерыпомог бы.Вот небольшой тест, который я взбил:
Declare @RoleId int;
Set @RoleId = 1;
With aspnet_Roles As
(
Select 1 As ApplicationId, 1 As RoleId, 'Parent Role A' As RoleName, Null As ParentRoleId
Union All Select 1, 2, 'Parent Role B', Null
Union All Select 1, 3, 'Parent Role C', Null
Union All Select 1, 4, 'Child Role A-A', 1
Union All Select 1, 5, 'Child Role A-B', 1
Union All Select 1, 6, 'Child Role A-C', 1
Union All Select 1, 7, 'Child Role A-A-A', 4
Union All Select 1, 8, 'Child Role A-A-B', 4
Union All Select 1, 9, 'Child Role A-A-C', 4
)
, aspnet_Roles_CTE ( ApplicationId, RoleId, RoleName, ParentRoleId, HierarchyLevel ) As
(
Select ApplicationId, RoleId, RoleName, ParentRoleId, 1 AS HierarchyLevel
From aspnet_Roles
Where RoleId = @RoleId
Union All
Select AR.ApplicationId, AR.RoleId, AR.RoleName, AR.ParentRoleId, HierarchyLevel + 1
From aspnet_Roles As AR
Join aspnet_Roles_CTE As CTE
On CTE.ApplicationId = AR.ApplicationId
And CTE.RoleId = AR.ParentRoleId
)
Select ApplicationId, RoleId, RoleName, ParentRoleId, HierarchyLevel
From aspnet_Roles_CTE
Результаты:
ApplicationId | RoleId | RoleName | ParentRoleId | HierarchyLevel
1 | 1 | Parent Role A | NULL | 1
1 | 4 | Child Role A-A | 1 | 2
1 | 5 | Child Role A-B | 1 | 2
1 | 6 | Child Role A-C | 1 | 2
1 | 7 | Child Role A-A-A | 4 | 3
1 | 8 | Child Role A-A-B | 4 | 3
1 | 9 | Child Role A-A-C | 4 | 3