Esiste un modo basato su set per caricare / leggere un ramo di un albero con HierarchyId


11

Sto giocando con HierarchyId e non ho trovato un modo basato sul set per fare quanto segue:

  • inserire tutte le sottostrutture contemporaneamente
  • recuperare tutte le sottostrutture contemporaneamente

Questa domanda è collegata alla mia precedente e sospetto che l'unico modo per eseguire queste due attività con HierarchyId sia un nodo o un livello alla volta. Se sto usando un percorso materializzato, entrambe le azioni sono facilmente compiute da un singolo (e banale) comando basato su set.

Cosa mi sto perdendo?

Modifica: ho anche perso un modo per spostare una sottostruttura, ma l'ho imparato dal commento di Mikael Eriksson


2
Hai visto questo? Moving Subtrees
Mikael Eriksson,

@MikaelEriksson puoi fare una risposta al tuo commento?
AK,

2
Sicuro. Ho anche elaborato un po 'su come capisco cosa sta succedendo. A proposito, ho testato solo un po 'su HierarchyId, non l'ho mai usato in produzione.
Mikael Eriksson,

Risposte:


5

La funzione da utilizzare è GetReparentedValue ma quando si utilizza solo GetReparentedValuel'albero potrebbe finire in uno stato "incoerente".

Ecco un codice fornito da Microsoft che si occupa di questo. Spostare sottotitoli .

Immagino che ciò sia correlato a Enforcing a tree . Utilizza una colonna calcolata per l'id padre che esegue un self join al PK.


Questa è la risposta migliore finora. Sfortunatamente, non vedo un modo per inserire / selezionare una sottostruttura di più di un livello in un comando.
AK,

3

Il recupero di un'intera sottostruttura è semplice: utilizzare il IsDescendentOfmetodo, come da MSDN

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

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

L'inserimento è più complesso ma il tuo problema principale sarà con i tuoi vincoli - ovviamente non puoi inserire oggetti figlio fino a quando il loro genitore non è stato impegnato. In questo caso, iterare e inserire in ordine gerarchico oppure disattivare i vincoli e inserire.

Quando si inserisce una grande quantità di dati - migrazione, inserimento batch o in blocco, ecc. - Disattivare il vincolo. Quando inserivo operativamente, ripetevo, poiché non ho riscontrato istanze durante l'esecuzione del sistema in cui è necessario inserire grandi quantità di grandi dimensioni nella gerarchia.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.