This looks like a case of using recursive CTE:
http://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx[
^]
declare @Member table (MemberID int, ParentID int, MemberTypeID int, Name varchar(50));
insert into @Member Values(1,NULL,1, 'E1');
insert into @Member Values(2, 1,3, 'E1 D');
insert into @Member Values(3,NULL,1, 'E2');
insert into @Member Values(6,NULL,1, 'E3');
insert into @Member Values(7, 6,2, 'E3 S');
insert into @Member Values(8, 3,2, 'E2 S');
insert into @Member Values(9, 3,3, 'E2 D');
insert into @Member Values(10,6,3, 'E3 D');
insert into @Member Values(11,1,2, 'E1 S');
with mem (MemberID, ParentID, MemberTypeID, Name, SortCode)
as(
select m.MemberID, m.ParentID, m.MemberTypeID, m.Name
,convert(varchar(100), m.MemberID) SortCode
from @Member m
where m.ParentID is null
union all
select m.MemberID, m.ParentID, m.MemberTypeID, m.Name
,convert(varchar(100),(SortCode + '.' + convert(varchar(5), m.MemberTypeID) + '-' + right('0000000000'+ rtrim(convert(varchar(5), m.MemberID)), 3))) SortCode
from mem p
inner join @Member m
on p.MemberID = m.ParentID
)
select * from mem
order by SortCode
;
You may have to fiddle with the SortCode.