Encontrar migalhas de pão para conjuntos aninhados

Estou usando conjuntos aninhados (também conhecido como passagem de árvore de pré-encomenda modificada) para armazenar uma lista de grupos e estou tentando encontrar uma maneira rápida de gerar trilhas de navegação (como uma string, não uma tabela) para TODOS os grupos de uma só vez . Meus dados também são armazenados usando o modelo de lista de adjacências (existem gatilhos para manter os dois sincronizados

Então, por exemplo:

ID   Name    ParentId  Left   Right
0    Node A  0         1      12
1    Node B  0         2      5
2    Node C  1         3      4
3    Node D  0         6      11
4    Node E  3         7      8
5    Node F  4         9      9

Que representa a árvore:

Node ANode BNode CNode DNode ENode F

Gostaria de poder ter uma função definida pelo usuário que retorne uma tabela:

ID  Breadcrumb
0   Node A
1   Node A > Node B
2   Node A > Node B > Node C
3   Node A > Node D
4   Node A > Node D > Node E
5   Node A > Node D > Node F

Para tornar isso um pouco mais complicado (embora isso esteja fora do escopo da questão), também tenho restrições de usuários que precisam ser respeitadas. Por exemplo, se eu tiver apenas acesso a id = 3, ao executar a consulta, devo obter:

ID  Breadcrumb
3   Node D
4   Node D > Node E
5   Node D > Node F

Tenho uma função definida pelo usuário que usa um ID do usuário como parâmetro e retorna uma tabela com os IDs de todos os grupos válidos, desde que em algum lugar na consulta

WHERE group.id IN (SELECT id FROM dbo.getUserGroups(@userid))

vai funcionar

Eu tenho uma função escalar existente que pode fazer isso, mas simplesmente não funciona em nenhum número razoável de grupos (leva> 10 segundos em 2000 grupos). Ele pega um groupid e userid como parâmetro e retorna um nvarchar. Ele encontra os pais dos grupos fornecidos (1 consulta para obter os valores esquerdo / direito, outra para encontrar os pais), restringe a lista aos grupos aos quais o usuário tem acesso (usando a mesma cláusula WHERE como acima, mais uma consulta), e, em seguida, usa um cursor para percorrer cada grupo e anexá-lo a uma sequência, antes de finalmente retornar esse valo

Preciso de um método para fazer isso que seja executado rapidamente (por exemplo, <= 1s), em tempo rea

Isto está no SQL Server 2005.

questionAnswers(6)

yourAnswerToTheQuestion