Existe uma maneira definida de carregar / ler um galho de árvore com HierarchyId

11

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

AK
fonte
2
você viu isso? Movendo subárvores
Mikael Eriksson #
@MikaelEriksson, você pode responder ao seu comentário?
AK
2
Certo. Também elaborei um pouco sobre como eu entendo o que está acontecendo. BTW, só testei um pouco no HierarchyId, nunca o usei na produção.
Mikael Eriksson

Respostas:

5

A função a ser usada é GetReparentedValue, mas ao usar apenas GetReparentedValuea á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.

Mikael Eriksson
fonte
Esta é a melhor resposta até agora. Infelizmente, não vejo uma maneira de inserir / selecionar uma subárvore de mais de um nível em um comando.
AK
3

A recuperação de uma subárvore inteira é simples - use o IsDescendentOfmétodo, conforme o MSDN

DECLARE @Manager hierarchyid
SELECT @Manager = OrgNode FROM HumanResources.EmployeeDemo
  WHERE LoginID = 'adventure-works\dylan0'

SELECT * FROM HumanResources.EmployeeDemo
WHERE OrgNode.IsDescendantOf(@Manager) = 1

A 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.

Kirk Broadhurst
fonte