hierarchyid (Transact-SQL)

Il tipo di dati hierarchyid è un tipo di dati di sistema di lunghezza variabile. Utilizzare hierarchyid per rappresentare la posizione in una gerarchia. Una colonna di tipo hierarchyid non rappresenta automaticamente un albero. È compito dell'applicazione generare e assegnare i valori hierarchyid in maniera tale che la relazione desiderata tra le righe sia riflessa nei valori.

Un valore del tipo di dati hierarchyid rappresenta una posizione in un albero gerarchico. I valori per hierarchyid hanno le proprietà descritte di seguito:

  • Estremamente compresso

    Il numero medio di bit richiesto per rappresentare un nodo in un albero con n nodi dipende dal fanout medio (il numero medio di elementi figlio di un nodo). Per i piccoli fanout (0-7), la dimensione è approssimativamente 6*logAn bit, dove A è il fanout medio. Un nodo in una gerarchia organizzativa di 100.000 persone con un fanout medio di 6 livelli richiede circa 38 bit. Viene arrotondato a 40 bit, o 5 byte, per l'archiviazione.

  • Il confronto avviene in ordine di scorrimento in profondità

    Dati due valori hierarchyida e b, a<b indica che a precede b nell'attraversamento del primo livello di profondità della struttura. Gli indici sui tipi di dati hierarchyid sono in ordine di scorrimento della profondità e i nodi l'uno vicino all'altro nell'attraversamento del primo livello di profondità della struttura sono archiviati l'uno vicino all'altro. Ad esempio, i figli di un record sono archiviati adiacenti al record specifico. Per ulteriori informazioni, vedere Utilizzo dei tipi di dati hierarchyid (Motore di database).

  • Supporto per eliminazioni e inserimenti arbitrari

    Utilizzando il metodo GetDescendant, è sempre possibile generare un elemento di pari livello a destra o a sinistra di un determinato nodo oppure tra due elementi di pari livello. La proprietà del confronto è gestita quando un numero arbitrario di nodi viene inserito o eliminato dalla gerarchia. La maggior parte degli inserimenti e delle eliminazioni mantiene la proprietà di compattezza. Tuttavia, gli inserimenti tra due nodi produrranno i valori hierarchyid con una rappresentazione leggermente meno compatta.

  • La codifica utilizzata nel tipo hierarchyid è limitata a 892 byte. I nodi che hanno troppi livelli nella rappresentazione per rientrare in 892 byte non possono di conseguenza essere rappresentati dal tipo hierarchyid.

Il tipo hierarchyid è disponibile per client CLR come tipo di dati SqlHierarchyId.

Osservazioni

Il tipo hierarchyid codifica logicamente informazioni su un solo nodo in un albero della gerarchia codificando il percorso dalla radice dell'albero al nodo. Tale percorso è rappresentato logicamente come una sequenza di etichette dei nodi di tutti gli elementi figlio visitati dopo la radice. La rappresentazione inizia con una barra. Un percorso che visita solo la radice è rappresentato da una singola barra. Per i livelli sotto la radice, ogni etichetta è codificata come una sequenza di numeri interi separata dai punti. Il confronto tra gli elementi figlio viene eseguito confrontando le sequenze di numeri interi separati da punti in base all'ordinamento del dizionario. Ogni livello è seguito da una barra. Una barra separa quindi i padri dai figli. Ad esempio, gli elementi seguenti sono percorsi hierarchyid validi rispettivamente di lunghezza di 1, 2, 2, 3 e 3 livelli:

  • /

  • /1/

  • /0.3.-7/

  • /1/3/

  • /0.1/0.2/

I nodi possono essere inseriti in qualsiasi posizione. I nodi inseriti dopo /1/2/ ma prima di /1/3/ possono essere rappresentati come /1/2.5/. Nodi inseriti prima di 0 sono rappresentati logicamente come numero negativo. Ad esempio, un nodo che precede /1/1/ può essere rappresentato come /1/-1/. Nei nodi non possono essere presenti zero iniziali. Ad esempio, /1/1.1/ è valido, mentre /1/1.01/ non è valido. Per evitare errori, inserire nodi utilizzando il metodo GetDescendant.

Conversione tipo di dati

È possibile convertire il tipo di dati hierarchyid in altri tipi di dati come segue:

  • Utilizzare il metodo ToString () per convertire il valore hierarchyid nella rappresentazione logica come un tipo di dati nvarchar(4000).

  • Utilizzare Read () e Write () per convertire hierarchyid in varbinary.

  • La conversione da hierarchyid a XML non è supportata. Per trasmettere i parametri hierarchyid tramite SOAP, eseguire prima il cast dei parametri come stringhe. Una query con la clausola FOR XML avrà esito negativo su una tabella con hierarchyid a meno che la colonna non sia prima convertita in un tipo di dati carattere.

Aggiornamento di database

Quando un database viene aggiornato a SQL Server 2008, il nuovo assembly e il tipo di dati hierarchyid saranno installati automaticamente. Le regole di preparazione aggiornamento rilevano qualsiasi tipo di utente o assembly con nomi in conflitto. La preparazione aggiornamento indicherà di rinominare qualsiasi assembly in conflitto e di rinominare eventuali tipi in conflitto o di utilizzare nomi in due parti nel codice che si riferiscano allo specifico tipo di utente preesistente.

Se un aggiornamento del database rileva un assembly utente con nome in conflitto, rinominerà automaticamente l'assembly e metterà il database in modalità sospetta.

Se durante l'aggiornamento esiste un utente con nome in conflitto, non viene eseguita alcuna operazione. Dopo l'aggiornamento, esisteranno sia il tipo di utente obsoleto che il nuovo tipo di sistema. Il tipo di utente sarà disponibile solo tramite nomi in due parti.

Utilizzo di colonne hierarchyid nelle tabelle replicate

Le colonne di tipo hierarchyid possono essere utilizzate su qualsiasi tabella replicata. I requisiti per l'applicazione dipendono dal tipo di replica direzionale o bidirezionale e dalla versioni del SQL Server utilizzato.

Replica direzionale

La replica direzionale include la replica snapshot, la replica transazionale e la replica di tipo merge in cui le modifiche non sono apportate al Sottoscrittore. Il modo in cui le colonne hierachyid funzionano con una replica direzionale dipende dalla versione di SQL Server che il Sottoscrittore sta eseguendo.

  • Un server di pubblicazione SQL Server 2008 può replicare colonne hierachyid in un SQL Server 2008 Sottoscrittore senza alcuna speciale considerazione.

  • Un server di pubblicazione SQL Server 2008 deve convertire le colonne hierarchyid per replicarle in un Sottoscrittore che sta eseguendo SQL Server Compact 3.5 SP1 oppure una versione precedente di SQL Server. SQL Server Compact 3.5 SP1 e le versioni precedenti di SQL Server non supportano le colonne hierarchyid. Se si utilizza una di queste versioni, è ancora possibile replicare dati in un Sottoscrittore. A questo scopo, è necessario impostare un'opzione dello schema o il livello di compatibilità della pubblicazione (per replica di tipo merge) in maniera tale che sia possibile convertire la colonna in un tipo di dati compatibile. Per ulteriori informazioni, vedere Utilizzo di più versioni di SQL Server in una topologia di replica.

L'applicazione di filtri di colonna è supportata in entrambi questi scenari. Include filtri per l'esclusione di colonne hierarchyid. L'applicazione di filtri di riga è supportata se il filtro non include una colonna hierarchyid.

Replica bidirezionale

La replica bidirezionale include la replica transazionale con aggiornamento di sottoscrizioni, la replica transazionale peer-to-peer e la replica di tipo merge in cui le modifiche sono apportate al Sottoscrittore. La replica consente di configurare una tabella con colonne hierarchyid per replica bidirezionale. Tenere presente i requisiti e considerazioni indicati di seguito.

  • Il server di pubblicazione e tutti i Sottoscrittori devono eseguire SQL Server 2008.

  • La replica esegue la replica dei dati come byte e non esegue alcuna convalida al fine di assicurare l'integrità della gerarchia.

  • La gerarchia delle modifiche apportate all'origine (Sottoscrittore o server di pubblicazione) non viene mantenuta quando le modifiche vengono replicate sulla destinazione.

  • I valori hash per le colonne hierarchyid sono specifici al database nel quale sono generati. Pertanto, lo stesso valore potrebbe essere generato sul server di pubblicazione e sul Sottoscrittore, ma potrebbe essere applicato a righe diverse. La replica non verifica questa condizione e non è disponibile nessuna modalità integrata per suddividere i valori della colonna hierarchyid analogamente a quanto accade per le colonne IDENTITY. Le applicazioni devono utilizzare vincoli o gli altri meccanismi per evitare che tali conflitti passino inosservati.

  • È possibile che le righe inserite nel Sottoscrittore saranno rese orfane. La riga padre della riga inserita può essere stata eliminata sul server di pubblicazione. Questo non consente di rilevare un conflitto quando una riga del Sottoscrittore viene inserita al server di pubblicazione.

  • I filtri colonne non possono filtrare colonne hierarchyid che non ammettono valori Null: gli inserimenti dal Sottoscrittore non verranno eseguiti perché non vi è alcun valore predefinito per la colonna hierarchyid nel server di pubblicazione.

  • L'applicazione di filtri di riga è supportata se il filtro non include una colonna hierarchyid.