Estou brincando com o HierarchyId e não descobri uma maneira baseada em conjunto para fazer o seguinte:
- insira todas as subárvores de uma só vez
- recuperar todas as subárvores de uma só vez
Esta pergunta está relacionada à minha anterior e suspeito que a única maneira de realizar essas duas tarefas com o HierarchyId seja um nó ou um nível de cada vez. Se eu estiver usando o caminho materializado, as duas ações serão facilmente executadas por um único comando (e trivial) baseado em conjunto.
o que estou perdendo?
Edit: Eu também perdi uma maneira de mover uma subárvore, mas aprendi com o comentário de Mikael Eriksson
Respostas:
A função a ser usada é GetReparentedValue, mas ao usar apenas
GetReparentedValue
a árvore, pode terminar em um estado "inconsistente".Aqui está um código fornecido pela Microsoft que cuida disso. Movendo subárvores .
Eu acho que relacionado a isso é impor uma árvore . Ele usa uma coluna calculada para o ID pai que faz uma auto-junção ao PK.
fonte
A recuperação de uma subárvore inteira é simples - use o
IsDescendentOf
método, conforme o MSDNA inserção é mais complexa, mas o problema principal será com suas restrições - você obviamente não pode inserir objetos filhos até que o pai deles seja confirmado. Nesse caso, itere e insira em ordem hierárquica ou desative as restrições e insira.
Ao inserir uma grande quantidade de dados - migração, inserção em lote ou em massa, etc. - eu desabilitava a restrição. Ao inserir operacionalmente, eu repetia, pois não encontrei instâncias durante a execução do sistema em que grandes quantidades de grandes dimensões precisam ser inseridas na hierarquia.
fonte