Справочник по методам типа данных hierarchyidhierarchyid data type method reference

ОБЛАСТЬ ПРИМЕНЕНИЯ:даSQL Server (начиная с 2008)даБаза данных SQL AzureдаХранилище данных SQL AzureнетParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Тип данных hierarchyid является системным типом данных переменной длины.The hierarchyid data type is a variable length, system data type. Тип данных hierarchyid используется для представления положения в иерархии.Use hierarchyid to represent position in a hierarchy. Столбец типа hierarchyid не принимает древовидную структуру автоматически.A column of type hierarchyid does not automatically represent a tree. Приложение должно создать и назначить значения hierarchyid таким образом, чтобы они отражали требуемые связи между строками.It is up to the application to generate and assign hierarchyid values in such a way that the desired relationship between rows is reflected in the values.

Значение типа данных hierarchyid представляет позицию в древовидной иерархии.A value of the hierarchyid data type represents a position in a tree hierarchy. Значения hierarchyid обладают следующими свойствами.Values for hierarchyid have the following properties:

  • Исключительная компактностьExtremely compact
    Среднее число бит, необходимое для представления узла в древовидной структуре с n узлами, зависит от среднего количества потомков у узла.The average number of bits that are required to represent a node in a tree with n nodes depends on the average fanout (the average number of children of a node). Для структур с низкой степенью ветвления (0–7) объем занимаемой памяти равен примерно 6*logAn бит, где A — среднее ветвление.For small fanouts (0-7), the size is about 6*logAn bits, where A is the average fanout. Для представления узла в иерархии организации, насчитывающей 100 000 человек со средним уровнем ветвления 6, необходимо около 38 бит.A node in an organizational hierarchy of 100,000 people with an average fanout of 6 levels takes about 38 bits. Эта величина округляется до 40 бит (5 байт), которые необходимы для хранения.This is rounded up to 40 bits, or 5 bytes, for storage.
  • Сравнение проводится в порядке приоритета глубиныComparison is in depth-first order
    Если заданы два значения hierarchyid — a и b, a<b означает, что значение a появляется раньше значения b, если проходить по дереву с приоритетным направлением в глубину.Given two hierarchyid values a and b, a<b means a comes before b in a depth-first traversal of the tree. Индексы для типов данных hierarchyid располагаются в порядке приоритета глубины, а узлы, встречающиеся рядом при проходе по дереву с приоритетным направлением глубины, хранятся рядом друг с другом.Indexes on hierarchyid data types are in depth-first order, and nodes close to each other in a depth-first traversal are stored near each other. Например, потомки некоторой записи хранятся рядом с этой записью.For example, the children of a record are stored adjacent to that record. Дополнительные сведения см. в статье Иерархические данные (SQL Server).For more information, see Hierarchical Data (SQL Server).
  • Поддержка произвольных вставок и удаленийSupport for arbitrary insertions and deletions
    С помощью метода GetDescendant можно в любой момент создать одноуровневый элемент, расположенный справа от заданного узла, слева от заданного узла или между любыми двумя другими одноуровневыми элементами.By using the GetDescendant method, it is always possible to generate a sibling to the right of any given node, to the left of any given node, or between any two siblings. Свойство сравнения сохраняется, если произвольное число узлов вставляется в иерархию или удаляется из нее.The comparison property is maintained when an arbitrary number of nodes is inserted or deleted from the hierarchy. Большинство операций вставки и удаления сохраняют свойство компактности.Most insertions and deletions preserve the compactness property. Однако операции вставки между двумя узлами приводят к созданию значений hierarchyid, обладающих менее компактным представлением.However, insertions between two nodes will produce hierarchyid values with a slightly less compact representation.
  • Кодировка в типе данных hierarchyid ограничена 892 байтами.The encoding used in the hierarchyid type is limited to 892 bytes. Следовательно, узлы, имеющие слишком много уровней, чтобы уместиться в 892 байта, не могут быть представлены типом данных hierarchyid.Consequently, nodes which have too many levels in their representation to fit into 892 bytes cannot be represented by the hierarchyid type.

Тип hierarchyid доступен клиентам CLR как тип данных SqlHierarchyId.The hierarchyid type is available to CLR clients as the SqlHierarchyId data type.

RemarksRemarks

Тип данных hierarchyid логически кодирует сведения об одном узле в дереве иерархии, кодируя путь от корня дерева к этому узлу.The hierarchyid type logically encodes information about a single node in a hierarchy tree by encoding the path from the root of the tree to the node. Такой путь логически представлен в виде последовательности меток всех посещенных дочерних узлов, начиная с корня.Such a path is logically represented as a sequence of node labels of all children visited after the root. Представление начинается косой чертой, а путь к корню представлен одной косой чертой.A slash starts the representation, and a path that only visits the root is represented by a single slash. Для уровней ниже корня каждая метка кодируется в виде последовательности целых чисел, разделенных точками.For levels underneath the root, each label is encoded as a sequence of integers separated by dots. Сравнения дочерних узлов выполняется путем сравнения этих целочисленных последовательностей, разделенных точками, в лексикографическом порядке.Comparison between children is performed by comparing the integer sequences separated by dots in dictionary order. Уровни разделяются косой чертой.Each level is followed by a slash. То есть косая черта отделяет родительский узел от дочернего.Therefore a slash separates parents from their children. Например, следующие пути с длиной 1, 2, 2, 3 и 3 уровня соответственно допустимы для типа hierarchyid:For example, the following are valid hierarchyid paths of lengths 1, 2, 2, 3, and 3 levels respectively:

  • /

  • /1//1/

  • /0.3.-7//0.3.-7/

  • /1/3//1/3/

  • /0.1/0.2//0.1/0.2/

Узлы можно вставлять в любое место.Nodes can be inserted in any location. Узлы, вставленные после /1/2/, но перед /1/3/, можно представить как /1/2.5/.Nodes inserted after /1/2/ but before /1/3/ can be represented as /1/2.5/. Узлы, вставленные после 0, логически представлены в виде отрицательных чисел.Nodes inserted before 0 have the logical representation as a negative number. Например, узел, расположенный перед узлом /1/1/, можно представить как /1/-1/.For example, a node that comes before /1/1/ can be represented as /1/-1/. Узлы не должны начинаться с нулей.Nodes cannot have leading zeros. Например, узел /1/1.1/ является допустимым, а узел /1/1.01/  — недопустим.For example, /1/1.1/ is valid, but /1/1.01/ is not valid. Чтобы избежать ошибок, вставляйте узлы с помощью метода GetDescendant.To prevent errors, insert nodes by using the GetDescendant method.

Преобразование типов данныхData type conversion

Тип данных hierarchyid можно преобразовывать в другие типы описанным ниже образом.The hierarchyid data type can be converted to other data types as follows:

  • Для преобразования значения типа hierarchyid в логическое представление типа данных nvarchar(4000) используется метод ToString().Use the ToString() method to convert the hierarchyid value to the logical representation as a nvarchar(4000) data type.
  • Для преобразования типа данных hierarchyid в тип varbinary используются методы Read () и Write ().Use Read () and Write () to convert hierarchyid to varbinary.
  • Чтобы передать параметры типа hierarchyid по протоколу SOAP, сначала нужно преобразовать их в строки.To transmit hierarchyid parameters through SOAP first cast them as strings.

Обновление баз данныхUpgrading databases

При обновлении базы данных до SQL Server 2017SQL Server 2017 автоматически устанавливаются новая сборка и тип данных hierarchyid.When a database is upgraded to SQL Server 2017SQL Server 2017, the new assembly and the hierarchyid data type will automatically be installed. Помощник по обновлению обнаружит все пользовательские типы данных или сборки с конфликтующими именами.Upgrade advisor rules detect any user type or assemblies with conflicting names. Помощник по обновлению посоветует переименовать все конфликтующие сборки и либо переименовать все конфликтующие типы данных, либо использовать в программном коде двухкомпонентные имена для ссылок на существующие определяемые пользователем типы данных.The upgrade advisor will advise renaming of any conflicting assembly, and either renaming any conflicting type, or using two-part names in the code to refer to that preexisting user type.

Если при обновлении базы данных обнаружится пользовательская сборка с конфликтующим именем, эта сборка автоматически переименуется, а база данных переведется в подозрительный режим.If a database upgrade detects a user assembly with conflicting name, it will automatically rename that assembly and put the database into suspect mode.

Если во время обновления обнаруживается пользовательский тип данных с конфликтующим именем, никаких специальных шагов не предпринимается.If a user type with conflicting name exists during the upgrade, no special steps are taken. После обновления будут существовать как старый пользовательский тип, так и новый системный тип данных.After the upgrade, both the old user type, and the new system type, will exist. Пользовательский тип данных будет доступен только с применением двухкомпонентных имен.The user type will be available only through two-part names.

Использование столбцов типа данных hierarchyid в реплицированных таблицахUsing hierarchyid columns in replicated tables

Столбцы с типом данных hierarchyid могут использоваться во всех реплицированных таблицах.Columns of type hierarchyid can be used on any replicated table. Требования к приложению ограничиваются способом репликации, однонаправленным или двунаправленным, и версией SQL ServerSQL Server.The requirements for your application depend on whether replication is one directional or bidirectional, and on the versions of SQL ServerSQL Server that are used.

Однонаправленная репликацияOne-directional replication

Однонаправленная репликация включает репликацию моментальных снимков, репликацию транзакций и репликацию слиянием, в которой изменения не выполняются на подписчике.One-directional replication includes snapshot replication, transactional replication, and merge replication in which changes are not made at the Subscriber. Способ обработки столбцов типа hierachyid при однонаправленной репликации зависит от версии SQL ServerSQL Server в подписчике.How hierarchyid columns work with one directional replication depends on the version of SQL ServerSQL Server the Subscriber is running.

  • Издатель SQL Server 2017SQL Server 2017 может реплицировать столбцы типа hierachyid в подписчик SQL Server 2017SQL Server 2017 без специальных усилий.A SQL Server 2017SQL Server 2017 Publisher can replicate hierarchyid columns to a SQL Server 2017SQL Server 2017 Subscriber without any special considerations.
  • Издатель SQL Server 2017SQL Server 2017 должен преобразовать столбцы hierarchyid для репликации их в подписчике, где запущен SQL Server CompactSQL Server Compact или одна из предыдущих версий SQL ServerSQL Server.A SQL Server 2017SQL Server 2017 Publisher must convert hierarchyid columns to replicate them to a Subscriber that is running SQL Server CompactSQL Server Compact or an earlier version of SQL ServerSQL Server. SQL Server CompactSQL Server Compact и предыдущие версии SQL ServerSQL Server не поддерживают столбцы hierarchyid.and earlier versions of SQL ServerSQL Server do not support hierarchyid columns. При использовании одной из этих версий все равно можно реплицировать данные на подписчик.If you are using one of these versions, you can still replicate data to a Subscriber. Для этого следует установить параметр схемы или уровень совместимости репликации (для репликации слиянием), чтобы столбец можно было преобразовать в совместимый тип данных.To do this, you must set a schema option or the publication compatibility level (for merge replication) so the column can be converted to a compatible data type.

Фильтрация столбцов поддерживается в обоих случаях.Column filtering is supported in both of these scenarios. При этом производится фильтрация столбцов типа hierarchyid.This includes filtering out hierarchyid columns. Фильтрация строк поддерживается, если фильтр не содержит столбец hierarchyid.Row filtering is supported as long as the filter does not include a hierarchyid column.

Двунаправленная репликацияBi-directional replication

Двунаправленная репликация включает репликацию транзакций с обновляемыми подписками, одноранговую репликацию транзакций и репликацию слиянием, при которых изменения выполняются на подписчике.Bi-directional replication includes transactional replication with updating subscriptions, peer-to-peer transactional replication, and merge replication in which changes are made at the Subscriber. Репликация позволяет настраивать таблицу со столбцами типа данных hierarchyid для двунаправленной репликации.Replication lets you configure a table with hierarchyid columns for bi-directional replication. Обратите внимание на следующие требования и рекомендации.Note the following requirements and considerations.

  • На издателе и подписчике должен работать SQL Server 2017SQL Server 2017.The Publisher and all Subscribers must be running SQL Server 2017SQL Server 2017.
  • Репликация реплицирует данные в виде байтов, не выполняя проверки целостности иерархии.Replication replicates the data as bytes and does not perform any validation to assure the integrity of the hierarchy.
  • Иерархия изменений источника (на подписчике или издателе) не поддерживается при репликации этих изменений.The hierarchy of the changes that were made at the source (Subscriber or Publisher) is not maintained when they replicate to the destination.
  • Значения хэша для столбцов типа данных hierarchyid зависят от базы данных, в которой созданы эти столбцы.The hash values for hierarchyid columns are specific to the database in which they are generated. Поэтому на подписчике и издателе могут создаваться одинаковые значения, но применяются они к разным строкам.Therefore, the same value could be generated on the Publisher and Subscriber, but it could be applied to different rows. Репликация не проверяет это условие. Кроме того, не существует встроенного метода секционирования значений столбца hierarchyid, который имеется для столбцов IDENTITY.Replication does not check for this condition, and there is no built-in way to partition hierarchyid column values as there is for IDENTITY columns. Чтобы избежать подобных необнаруживаемых конфликтов, приложения должны использовать ограничения или другие механизмы проверки.Applications must use constraints or other mechanisms to avoid such undetected conflicts.
  • Возможно, что строки, вставленные на подписчике, окажутся потерянными.It is possible that rows that are inserted on the Subscriber will be orphaned. Родительскую строку на издателе могут удалить.The parent row of the inserted row might have been deleted at the Publisher. Это приводит к необнаруживаемому конфликту, если строка из подписчика вставляется на издателе.This results in an undetected conflict when the row from the Subscriber is inserted at the Publisher.
  • Фильтры столбцов не могут отфильтровывать не допускающие значения NULL столбцы типа hierarchyid. Вставка из подписчика приведет к ошибке, так как в издателе не существует значений по умолчанию для столбца типа hierarchyid.Column filters cannot filter out non-nullable hierarchyid columns: inserts from the Subscriber will fail because there is no default value for the hierarchyid column on the Publisher.
  • Фильтрация строк поддерживается, если фильтр не содержит столбец hierarchyid.Row filtering is supported as long as the filter does not include a hierarchyid column.

См. также разделSee also

Иерархические данные (SQL Server)Hierarchical Data (SQL Server)
Справочник по методам типа данных hierarchyidhierarchyid Data Type Method Reference