hierarchyid-metodreferens för datatyp

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-databas i Microsoft Fabric

hierarchyid datatyp är en variabel längd, systemdatatyp. Använd hierarchyid för att representera position i en hierarki. En kolumn av typen hierarchyid representerar inte automatiskt ett träd. Det är upp till programmet att generera och tilldela hierarkiidvärden på ett sådant sätt att den önskade relationen mellan rader återspeglas i värdena.

Ett värde för hierarchyid datatyp representerar en position i en trädhierarki. Värden för hierarchyid ha följande egenskaper:

  • Extremt kompakt: Det genomsnittliga antalet bitar som krävs för att representera en nod i ett träd med n-noder beror på den genomsnittliga fanouten (det genomsnittliga antalet underordnade av en nod). För små fanouts (0–7) är storleken cirka 6 * logA n bitar, där A är den genomsnittliga fanouten. En nod i en organisationshierarki med 100 000 personer med en genomsnittlig fanout på sex nivåer tar cirka 38 bitar. Detta avrundas upp till 40 bitar, eller 5 byte, för lagring.

  • Jämförelsen är i djup-första ordning: Givet två hierarchyid-värdena och b, a<b innebär det att en kommer före b i en djup-första bläddering av trädet. Index på hierarkiid datatyper är i djupordning, och noder nära varandra i en djup-första bläddering lagras nära varandra. Till exempel lagras underordnade poster i anslutning till posten. Mer information finns i Hierarkiska data (SQL Server).

  • Stöd för godtyckliga infogningar och borttagningar: Med metoden GetDescendant kan du alltid generera ett syskon till höger om en viss nod, till vänster om en viss nod eller mellan två syskon. Jämförelseegenskapen bibehålls när ett godtyckligt antal noder infogas eller tas bort från hierarkin. De flesta infogningar och borttagningar bevarar kompakthetsegenskapen. Infogningar mellan två noder ger dock hierarkiidvärden med en något mindre kompakt representation.

  • Kodningen är begränsad till 892 byte: Därför kan noder som har för många nivåer i sin representation för att passa in i 892 byte inte representeras av typen hierarchyid .

Typen hierarchyid är tillgänglig för CLR-klienter (Common Language Runtime) som SqlHierarchyId datatyp.

Remarks

hierarchyid typ kodar logiskt information om en enskild nod i ett hierarkiträd genom att koda sökvägen från trädets rot till noden. En sådan sökväg representeras logiskt som en sekvens med nodetiketter för alla underordnade som besöks efter roten. Ett snedstreck startar representationen och en sökväg som bara besöker roten representeras av ett enda snedstreck. För nivåer under roten kodas varje etikett som en sekvens med heltal avgränsade med punkter.

Jämförelse mellan underordnade utförs genom att jämföra heltalssekvenserna avgränsade med punkter i ordlisteordning. Varje nivå följs av ett snedstreck. Därför separerar ett snedstreck föräldrar från sina barn. Följande är till exempel giltiga hierarchyid sökvägar med längder 1, 2, 2, 3 respektive 3 nivåer:

  • /
  • /1/
  • /0.3.-7/
  • /1/3/
  • /0.1/0.2/

Noder kan infogas på valfri plats. Noder som infogats efter /1/2/ men innan /1/3/ kan representeras som /1/2.5/. Noder som infogats tidigare 0 har den logiska representationen som ett negativt tal. En nod som kommer tidigare /1/1/ kan till exempel representeras som /1/-1/. Noder kan inte ha inledande nollor. Är till exempel /1/1.1/ giltigt, men /1/1.01/ är inte giltigt. För att förhindra fel infogar du noder med hjälp av metoden GetDescendant.

Konvertering av datatyp

hierarchyid datatyp kan konverteras till andra datatyper på följande sätt:

  • Använd metoden ToString för att konvertera värdet hierarchyid till den logiska representationen som en nvarchar(4000) datatyp.

  • Använd Read (Database Engine) med hjälp av CSharp och Write för att konvertera hierarchyid till varbinary.

  • Om du vill överföra hierarkiparametrar via SOAP ska du först omvandla dem som strängar.

Uppgradera databaser

När en databas uppgraderas till en nyare version av SQL Server installeras den nya sammansättningen och datatypen hierarchyid automatiskt. Regler för uppgraderingsrådgivare identifierar alla användartyper eller sammansättningar med motstridiga namn. Uppgraderingsrådgivaren rekommenderar att du byter namn på en sammansättning som är i konflikt och antingen byter namn på någon konflikttyp eller använder tvådelade namn i koden för att referera till den befintliga användartypen.

Om en databasuppgradering identifierar en användarsammansättning med motstridiga namn byter den automatiskt namn på sammansättningen och placerar databasen i misstänkt läge.

Om det finns en användartyp med ett namn som står i konflikt under uppgraderingen vidtas inga särskilda åtgärder. Efter uppgraderingen finns både den gamla användartypen och den nya systemtypen. Användartypen är endast tillgänglig via tvådelade namn.

Använda hierarchyid-kolumner i replikerade tabeller

Kolumner av typen hierarchyid kan användas i valfri replikerad tabell. Kraven för ditt program beror på om replikeringen är en riktning eller dubbelriktad, och på de versioner av SQL Server som används.

Replikering i en riktning

Enriktad replikering omfattar replikering av ögonblicksbilder, transaktionsreplikering och sammanslagningsreplikering där ändringar inte görs hos prenumeranten. Hur hierarkiid kolumner fungerar med en riktningsreplikering beror på vilken version av SQL Server prenumeranten kör.

  • En SQL Server Publisher kan replikera hierarchyid kolumner till en SQL Server-prenumerant av samma version utan några särskilda överväganden.

  • En SQL Server Publisher måste konvertera hierarkiidkolumner för att replikera dem till en prenumerant som kör SQL Server Compact eller en tidigare version av SQL Server. SQL Server Compact och tidigare versioner av SQL Server stöder inte hierarkiidkolumner . Om du använder någon av dessa versioner kan du fortfarande replikera data till en prenumerant. För att göra detta måste du ange ett schemaalternativ eller publikationens kompatibilitetsnivå (för sammanslagningsreplikering) så att kolumnen kan konverteras till en kompatibel datatyp.

Kolumnfiltrering stöds i båda dessa scenarier. Detta omfattar filtrering av hierarchyid kolumner. Radfiltrering stöds så länge filtret inte innehåller en hierarchyid-kolumn .

Dubbelriktad replikering

Dubbelriktad replikering omfattar transaktionsreplikering med uppdatering av prenumerationer, peer-to-peer-transaktionsreplikering och sammanslagningsreplikering där ändringar görs hos prenumeranten. Med replikering kan du konfigurera en tabell med hierarchyid kolumner för dubbelriktad replikering. Observera följande krav och överväganden.

  • Utgivaren och alla prenumeranter måste köra samma version på SQL Server 2016 (13.x) eller en senare version.

  • Replikering replikerar data som byte och utför ingen validering för att säkerställa hierarkins integritet.

  • Hierarkin för de ändringar som gjordes vid källan (prenumerant eller utgivare) behålls inte när de replikeras till målet.

  • Värdena för hierarchyid-kolumner kan ha identiska binära representationer i alla databaser. Konflikter kan uppstå i dubbelriktad replikering när programlogik självständigt genererar samma hierarkiid för olika entiteter. Därför kan samma värde genereras på utgivaren och prenumeranten, men det kan tillämpas på olika rader. Replikeringen söker inte efter det här villkoret och det finns inget inbyggt sätt att partitionera hierarki-kolumnvärden som det finns för IDENTITY kolumner. Program måste använda begränsningar eller andra mekanismer för att undvika sådana oupptäckta konflikter.

  • Det är möjligt att rader som infogas i prenumeranten kan bli överblivna. Den överordnade raden för den infogade raden kan tas bort i Publisher. Detta resulterar i en oidentifierad konflikt när raden från Prenumeranten infogas i Publisher.

  • Kolumnfilter kan inte filtrera bort icke-nullbara hierarki-ID-kolumner . Infogningar från Prenumeranten misslyckas eftersom det inte finns något standardvärde för kolumnen hierarchyid i Publisher.

  • Radfiltrering stöds så länge filtret inte innehåller en hierarchyid-kolumn .