Naslaginformatie over de methode hierarchyid-gegevenstype
van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric
De hierarchyid gegevenstype is een variabele lengte, systeemgegevenstype. Gebruik hiërarchie-id om de positie in een hiërarchie weer te geven. Een kolom van het type hiërarchie-id vertegenwoordigt niet automatisch een structuur. Het is aan de toepassing om hiërarchie-id waarden te genereren en toe te wijzen op een zodanige manier dat de gewenste relatie tussen rijen wordt weergegeven in de waarden.
Een waarde van de hiërarchie-id gegevenstype vertegenwoordigt een positie in een structuurhiërarchie. Waarden voor hierarchyid de volgende eigenschappen hebben:
- Extreem compact
Het gemiddelde aantal bits dat nodig is om een knooppunt in een boomstructuur weer te geven met n knooppunten, is afhankelijk van de gemiddelde fanout (het gemiddelde aantal onderliggende elementen van een knooppunt). Voor kleine fanouts (0-7) is de grootte ongeveer 6*logAn bits, waarbij A de gemiddelde fanout is. Een knooppunt in een organisatiehiërarchie van 100.000 personen met een gemiddelde fanout van 6 niveaus duurt ongeveer 38 bits. Dit wordt afgerond op 40 bits of 5 bytes voor opslag. - Vergelijking is in diepte-eerste volgorde
Gezien twee hiërarchie-id's waarden een en b, betekent een<b een komt voor b in een diepte-eerste doorkruising van de boomstructuur. Indexen op hiërarchie-id gegevenstypen zijn in uitgebreide volgorde en knooppunten dicht bij elkaar in een diepte-eerste doorkruising worden bij elkaar opgeslagen. De onderliggende items van een record worden bijvoorbeeld naast die record opgeslagen. Zie Hierarchical Data (SQL Server)voor meer informatie. - Ondersteuning voor willekeurige invoegingen en verwijderingen
Door de methode GetDescendant te gebruiken, is het altijd mogelijk om een knooppunt rechts van een bepaald knooppunt, links van een bepaald knooppunt of tussen twee broers en zussen te genereren. De vergelijkingseigenschap wordt gehandhaafd wanneer een willekeurig aantal knooppunten wordt ingevoegd of verwijderd uit de hiërarchie. De meeste invoegingen en verwijderingen behouden de compactheidseigenschap. Invoegingen tussen twee knooppunten produceren echter hiërarchie-id-waarden met een iets minder compacte weergave. - De codering die wordt gebruikt in de hierarchyid type is beperkt tot 892 bytes. Daarom kunnen knooppunten met te veel niveaus in hun weergave in 892 bytes niet worden vertegenwoordigd door de hiërarchie-id type.
Het type hierarchyid is beschikbaar voor CLR-clients als het SqlHierarchyId gegevenstype.
Opmerkingen
De hierarchyid type codeert informatie over één knooppunt in een hiërarchiestructuur logisch door het pad te coderen van de hoofdmap van de structuur naar het knooppunt. Een dergelijk pad wordt logisch weergegeven als een reeks knooppuntlabels van alle onderliggende items die na de hoofdmap zijn bezocht. Een slash start de weergave en een pad dat alleen de hoofdmap bezoekt, wordt vertegenwoordigd door één slash. Voor niveaus onder de hoofdmap wordt elk label gecodeerd als een reeks gehele getallen, gescheiden door puntjes. Vergelijking tussen onderliggende items wordt uitgevoerd door de gehele getallen te vergelijken, gescheiden door puntjes in woordenlijstvolgorde. Elk niveau wordt gevolgd door een slash. Daarom scheidt een slash ouders van hun kinderen. Het volgende zijn bijvoorbeeld geldige hiërarchie-id paden met respectievelijk lengten 1, 2, 2, 3 en 3:
/
/1/
/0.3.-7/
/1/3/
/0.1/0.2/
Knooppunten kunnen op elke locatie worden ingevoegd. Knooppunten die zijn ingevoegd na /1/2/, maar vóór /1/3/ kunnen worden weergegeven als /1/2,5/. Knooppunten die vóór 0 zijn ingevoegd, hebben de logische weergave als een negatief getal. Een knooppunt dat bijvoorbeeld vóór /1/1/ wordt weergegeven als /1/-1/. Knooppunten kunnen geen voorloopnullen hebben. Bijvoorbeeld, /1/1.1/ geldig is, maar /1/1.01/ is ongeldig. Als u fouten wilt voorkomen, voegt u knooppunten in met behulp van de methode GetDescendant.
Conversie van gegevenstype
De hierarchyid gegevenstype kan als volgt worden geconverteerd naar andere gegevenstypen:
- Gebruik de methode
ToString() om de hiërarchie-id waarde te converteren naar de logische weergave als eennvarchar(4000) gegevenstype. - Gebruik Read () en Write () om hiërarchie-id te converteren naar varbinaire.
- Als u hiërarchie-id parameters via SOAP wilt verzenden, casten ze eerst als tekenreeksen.
Databases upgraden
Wanneer een database wordt bijgewerkt naar een nieuwere versie van SQL Server, worden de nieuwe assembly en de hierarchyid gegevenstype automatisch geïnstalleerd. Upgrade advisor-regels detecteren elk gebruikerstype of assembly's met conflicterende namen. De upgradeadviseur adviseert om de naam van een conflicterende assembly te wijzigen en een conflicterend type te hernoemen, of het gebruik van tweedelige namen in de code om te verwijzen naar dat bestaande gebruikerstype.
Als een database-upgrade een gebruikersassembly detecteert met een conflicterende naam, wordt de naam van die assembly automatisch gewijzigd en wordt de database in de verdachte modus geplaatst.
Als er tijdens de upgrade een gebruikerstype met een conflicterende naam bestaat, worden er geen speciale stappen uitgevoerd. Na de upgrade bestaan zowel het oude gebruikerstype als het nieuwe systeemtype. Het gebruikerstype is alleen beschikbaar via tweedelige namen.
Hiërarchie-id-kolommen gebruiken in gerepliceerde tabellen
Kolommen van het type hiërarchie-id kunnen worden gebruikt voor elke gerepliceerde tabel. De vereisten voor uw toepassing zijn afhankelijk van of replicatie één richting of bidirectioneel is, en op de versies van SQL Server die worden gebruikt.
Eenrichtingsreplicatie
Eenrichtingsreplicatie omvat replicatie van momentopnamen, transactionele replicatie en samenvoegingsreplicatie waarin geen wijzigingen worden aangebracht bij de abonnee. Hoe hiërarchie-id kolommen met één richtingsreplicatie werken, is afhankelijk van de versie van SQL Server waarop de abonnee wordt uitgevoerd.
- Een SQL Server Publisher kan hiërarchie-id kolommen repliceren naar een SQL Server-abonnee van dezelfde versie zonder speciale overwegingen.
- Een SQL Server Publisher moet hiërarchie-id kolommen converteren om ze te repliceren naar een abonnee waarop SQL Server Compact of een eerdere versie van SQL Server wordt uitgevoerd. SQL Server Compact en eerdere versies van SQL Server bieden geen ondersteuning voor hiërarchie-id kolommen. Als u een van deze versies gebruikt, kunt u nog steeds gegevens repliceren naar een abonnee. Hiervoor moet u een schemaoptie of het compatibiliteitsniveau van de publicatie instellen (voor samenvoegreplicatie), zodat de kolom kan worden geconverteerd naar een compatibel gegevenstype.
Kolomfiltering wordt ondersteund in beide scenario's. Dit omvat het uitfilteren van hiërarchie-id kolommen. Rijfiltering wordt ondersteund zolang het filter geen hiërarchie-id kolom bevat.
Bidirectionele replicatie
Bidirectionele replicatie omvat transactionele replicatie met het bijwerken van abonnementen, peer-to-peer transactionele replicatie en samenvoegingsreplicatie waarin wijzigingen worden aangebracht bij de abonnee. Met replicatie kunt u een tabel configureren met hiërarchie-id kolommen voor bidirectionele replicatie. Let op de volgende vereisten en overwegingen.
- Publisher en alle abonnees moeten dezelfde versie van SQL Server 2016 (13.x) of hoger hebben.
- Replicatie repliceert de gegevens als bytes en voert geen validatie uit om de integriteit van de hiërarchie te garanderen.
- De hiërarchie van de wijzigingen die zijn aangebracht in de bron (Abonnee of Uitgever) wordt niet bijgehouden wanneer deze naar de bestemming worden gerepliceerd.
- De hashwaarden voor hiërarchie-id kolommen zijn specifiek voor de database waarin ze worden gegenereerd. Daarom kan dezelfde waarde worden gegenereerd op de uitgever en abonnee, maar kan deze worden toegepast op verschillende rijen. Replicatie controleert niet op deze voorwaarde en er is geen ingebouwde manier om hiërarchie-id te partitioneren kolomwaarden, zoals er is voor IDENTITY-kolommen. Toepassingen moeten beperkingen of andere mechanismen gebruiken om dergelijke niet-gedetecteerde conflicten te voorkomen.
- Het is mogelijk dat rijen die op de abonnee zijn ingevoegd, zwevend zijn. De bovenliggende rij van de ingevoegde rij is mogelijk verwijderd in Publisher. Dit resulteert in een niet-gedetecteerd conflict wanneer de rij van de abonnee wordt ingevoegd bij publisher.
- Kolomfilters kunnen niet-nullable hierarchyid kolommen niet uitfilteren: invoegen van de abonnee mislukt omdat er geen standaardwaarde is voor de hiërarchie-id kolom in Publisher.
- Rijfiltering wordt ondersteund zolang het filter geen hiërarchie-id kolom bevat.
Zie ook
gegevenstype van de hiërarchie-id