Freigeben über


Methodenverweis für den Datentyp „hierarchyid“

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzSQL-Datenbank in Microsoft Fabric

Der hierarchyid-Datentyp ist ein Systemdatentyp mit variabler Länge. Sie können hierarchyid verwenden, um die Position in einer Hierarchie darzustellen. Eine Spalte vom Typ "hierarchyid " stellt keine Struktur automatisch dar. Es liegt an der Anwendung, Hierarchie-ID-Werte so zu generieren und zuzuweisen, dass die gewünschte Beziehung zwischen Zeilen in den Werten widerzuspiegeln ist.

Ein Wert des hierarchyid -Datentyps stellt eine Position in einer Strukturhierarchie dar. Werte des Typs hierarchyid verfügen über die folgenden Eigenschaften:

  • Extrem kompakt: Die durchschnittliche Anzahl der Bits, die erforderlich sind, um einen Knoten in einer Struktur mit n Knoten darzustellen, hängt vom durchschnittlichen Fanout (die durchschnittliche Anzahl der untergeordneten Elemente eines Knotens) ab. Bei kleinen Fanouts (0-7) beträgt die Größe etwa 6 * logA n Bit, wobei A der durchschnittliche Fanout ist. Ein Knoten in einer Organisationshierarchie von 100.000 Personen mit einem durchschnittlichen Fanout von sechs Ebenen dauert etwa 38 Bit. Dieser Wert wird bei der Speicherung auf 40 Bit oder 5 Byte aufgerundet.

  • Vergleich ist in erster Reihenfolge: Bei zwei Hierarchie-ID-Wertena und b, a<b bedeutet ein vor b in einem tiefen ersten Durchgang der Struktur. Indizes für hierarchyid -Datentypen verwenden die Tiefensuchreihenfolge, und einander benachbarte Knoten werden bei der Tiefensuchreihenfolge nahe beieinander gespeichert. Einem Datensatz untergeordnete Datensätze werden zum Beispiel angrenzend an diesen Datensatz gespeichert. Weitere Informationen finden Sie unter Hierarchische Daten (SQL Server).

  • Unterstützung für beliebige Einfügungen und Löschungen: Mithilfe der GetDescendant-Methode ist es immer möglich, ein gleichgeordnetes Element rechts neben einem bestimmten Knoten, links von einem beliebigen Knoten oder zwischen zwei gleichgeordneten Knoten zu generieren. Die Vergleichseigenschaft bleibt auch dann gewahrt, wenn eine beliebige Anzahl von Knoten in die Hierarchie eingefügt oder aus ihr gelöscht wird. Die meisten Einfüge- und Löschoperationen behalten die Kompaktheitseigenschaft bei. Einfügungen zwischen zwei Knoten erzeugen jedoch Hierarchie-ID-Werte mit einer etwas weniger kompakten Darstellung.

  • Die Codierung ist auf 892 Bytes beschränkt: Daher können Knoten, die zu viele Ebenen in ihrer Darstellung enthalten, in 892 Byte passen, nicht durch den Hierarchie-Typ dargestellt werden.

Der Hierarchyid-Typ ist für ClR-Clients (Common Language Runtime) als SqlHierarchyId Datentyp verfügbar.

Remarks

Der hierarchyid-Typ codiert Informationen logisch über einen einzelnen Knoten in einer Hierarchiestruktur, indem der Pfad vom Stammelement der Struktur bis zum Knoten codiert wird. Ein solcher Pfad wird logisch dargestellt als eine Sequenz von Knotenbezeichnungen aller untergeordneten Elemente nach dem Stammelement. Die Darstellung beginnt mit einem Schrägstrich, und ein Pfad, der nur das Stammelement enthält, wird durch einen einzelnen Schrägstrich dargestellt. Für Ebenen unter dem Stammelement wird jede Bezeichnung als eine Sequenz von ganzen Zahlen codiert, die durch Punkte getrennt sind.

Ein Vergleich zwischen untergeordneten Elementen wird ausgeführt, indem die durch Punkte getrennten Sequenzen von ganzen Zahlen in Wörterbuchreihenfolge verglichen werden. Auf jede Ebene folgt ein Schrägstrich. Deshalb werden übergeordnete Elemente von ihren untergeordneten Elementen durch einen ein Schrägstrich getrennt. Die folgenden Beispiele sind gültige hierarchyid-Pfade mit Längen von jeweils 1, 2, 2, 3 und 3 Ebenen:

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

Knoten können an jedem Speicherort eingefügt werden. Knoten, die nach, /1/2/ aber vorher /1/3/ eingefügt wurden, können als /1/2.5/dargestellt werden. Zuvor eingefügte Knoten weisen die logische Darstellung als negative Zahl auf 0 . Beispielsweise kann ein Knoten, der vorkommt /1/1/ , als /1/-1/dargestellt werden. Knoten können keine führenden Nullen haben. Beispielsweise /1/1.1/ ist gültig, aber /1/1.01/ nicht gültig. Fügen Sie Knoten mit der GetDescendant-Methode ein, um Fehler zu vermeiden.

Konvertieren von Datentypen

Der hierarchyid-Datentyp kann folgendermaßen in andere Datentypen konvertiert werden:

  • Verwenden Sie die ToString-Methode , um den hierarchieid-Wert in die logische Darstellung als nvarchar(4000)- Datentyp zu konvertieren.

  • Verwenden Sie Read (Database Engine) mithilfe von CSharp und Write , um hierarchieid in varbinary zu konvertieren.

  • Um hierarchieid-Parameter über SOAP zu übertragen, wandeln Sie sie zuerst als Zeichenfolgen um.

Upgrade von Datenbanken

Wenn ein Upgrade einer Datenbank auf eine neuere Version von SQL Server erfolgt, werden die neue Assembly und der hierarchieid-Datentyp automatisch installiert. Upgrade Advisor-Regeln erkennen alle Benutzertypen oder Assemblys mit in Konflikt stehenden Namen. Der Upgraderatgeber empfiehlt das Umbenennen einer konfliktierenden Assembly und entweder das Umbenennen eines konfliktierenden Typs oder die Verwendung von zweiteiligen Namen im Code, um auf diesen bereits vorhandenen Benutzertyp zu verweisen.

Wenn ein Datenbankupgrade eine Benutzerassembly mit widersprüchlichem Namen erkennt, wird diese Assembly automatisch umbenannt und die Datenbank in den verdächtigen Modus versetzt.

Sollte während des Upgrades ein Benutzertyp mit in Konflikt stehendem Namen vorhanden sein, werden keine speziellen Schritte ausgeführt. Nach dem Upgrade sind sowohl der alte Benutzertyp als auch der neue Systemtyp vorhanden. Der Benutzertyp ist nur über zweiteilige Namen verfügbar.

Verwenden von Hierarchie-ID-Spalten in replizierten Tabellen

Spalten vom Typ hierarchyid können in jeder replizierten Tabelle verwendet werden. Die Anforderungen für Ihre Anwendung hängen davon ab, ob die Replikation eindirektional oder bidirektional ist, und davon, welche Versionen von SQL Server verwendet werden.

Unidirektionale Replikation

Die 1-direktionale Replikation umfasst die Momentaufnahmereplikation, die Transaktionsreplikation und die Zusammenführungsreplikation, bei der Änderungen nicht am Abonnenten vorgenommen werden. Wie hierarchyid-Spalten bei unidirektionaler Replikation funktionieren, hängt von der Version von SQL Server ab, die der Abonnent ausführt.

  • Ein SQL Server-Verleger kann hierarchyid-Spalten problemlos auf einen SQL Server-Abonnenten derselben Version replizieren.

  • Ein SQL Server-Herausgeber muss Hierarchie-ID-Spalten konvertieren, um sie in einen Abonnenten zu replizieren, der SQL Server Compact oder eine frühere Version von SQL Server ausführt. SQL Server Compact und frühere Versionen von SQL Server unterstützen keine Hierarchiespalten . Wenn Sie eine dieser Versionen verwenden, können Sie weiterhin Daten in einen Abonnenten replizieren. Dazu müssen Sie eine Schemaoption oder (bei der Mergereplikation) den Veröffentlichungskompatibilitätsgrad festlegen, sodass die Spalte in einen kompatiblen Datentyp konvertiert werden kann.

Die Spaltenfilterung wird in beiden dieser Szenarios unterstützt. Dies beinhaltet auch das Filtern von hierarchyid-Spalten. Die Zeilenfilterung wird unterstützt, solange der Filter keine Hierarchiespalte enthält.

Bidirektionale Replikation

Zur bidirektionalen Replikation gehören die Transaktionsreplikation mit aktualisierbaren Abonnements, die Peer-zu-Peer-Transaktionsreplikation und die Mergereplikation, bei denen Änderungen auf dem Abonnenten vorgenommen werden. Bei der Replikation können Sie eine Tabelle mit hierarchyid-Spalten für die bidirektionale Replikation konfigurieren. Beachten Sie die folgenden Voraussetzungen und Überlegungen.

  • Der Herausgeber und alle Abonnenten müssen dieselbe Version ausführen, auf SQL Server 2016 (13.x) oder einer höheren Version.

  • Replikation repliziert die Daten als Bytes und führt keine Überprüfung durch, um die Integrität der Hierarchie zu gewährleisten.

  • Die Hierarchie der Änderungen, die an der Quelle (Abonnent oder Publisher) vorgenommen wurden, wird beim Replizieren auf das Ziel nicht beibehalten.

  • Die Werte für hierarchieid-Spalten können identische binäre Darstellungen in allen Datenbanken aufweisen. Konflikte können bei der bidirektionalen Replikation auftreten, wenn Anwendungslogik unabhängig voneinander dieselbe Hierarchie-ID für unterschiedliche Entitäten generiert. Aus diesem Grund könnte der gleiche Wert auf dem Verleger und dem Abonnenten generiert, jedoch auf verschiedene Zeilen angewendet werden. Die Replikation sucht nicht nach dieser Bedingung, und es gibt keine integrierte Möglichkeit, Hierarchie-Spaltenwerte zu partitionieren, da es für IDENTITY Spalten vorhanden ist. Anwendungen müssen Einschränkungen oder andere Mechanismen verwenden, um solche unerkannten Konflikte zu vermeiden.

  • Es ist möglich, dass Zeilen, die in den Abonnenten eingefügt werden, verwaist werden können. Die übergeordnete Zeile der eingefügten Zeile wird möglicherweise in Publisher gelöscht. Dies führt zu einem unerkannten Konflikt, wenn die Zeile vom Abonnenten auf dem Verleger eingefügt wird.

  • Spaltenfilter können nicht nullwerte Hierarchie-ID-Spalten herausfiltern. Beim Einfügen aus dem Abonnenten tritt ein Fehler auf, da für die Hierarchie-ID-Spalte in Publisher kein Standardwert vorhanden ist.

  • Die Zeilenfilterung wird unterstützt, solange der Filter keine Hierarchiespalte enthält.