hierarchyid (Transact-SQL)
Тип данных hierarchyid является системным типом данных переменной длины. Тип данных hierarchyid используется для представления положения в иерархии. Столбец типа hierarchyid не принимает древовидную структуру автоматически. Приложение должно создать и назначить значения hierarchyid таким образом, чтобы они отражали требуемые связи между строками.
Значение типа данных hierarchyid представляет позицию в древовидной иерархии. Значения hierarchyid обладают следующими свойствами.
Исключительная компактность
Среднее число бит, необходимое для представления узла в древовидной структуре с n узлами, зависит от среднего количества потомков у узла. Для небольших уровней ветвления (0 - 7) этот размер равен 6*logAn бит, где A — средний уровень ветвления. Для представления узла в иерархии организации, насчитывающей 100 000 человек со средним уровнем ветвления 6, необходимо около 38 бит. Эта величина округляется до 40 бит (5 байт), которые необходимы для хранения.
Сравнение проводится в порядке приоритета глубины
Если заданы два значения hierarchyid a и b, a<b означает, что значение a появляется раньше значения b, если проходить по дереву с приоритетным направлением в глубину. Индексы для типов данных hierarchyid располагаются в порядке приоритета глубины, и узлы, встречающиеся рядом при проходе по дереву с приоритетным направлением глубины, хранятся рядом друг с другом. Например, потомки некоторой записи хранятся рядом с этой записью. Дополнительные сведения см. в разделе Иерархические данные (SQL Server).
Поддержка произвольных вставок и удалений
С помощью метода GetDescendant можно в любой момент создать одноуровневый элемент, расположенный справа от заданного узла, слева от заданного узла или между любыми двумя другими одноуровневыми элементами. Свойство сравнения сохраняется, если произвольное число узлов вставляется в иерархию или удаляется из нее. Большинство операций вставки и удаления сохраняют свойство компактности. Однако операции вставки между двумя узлами приводят к созданию значений hierarchyid, обладающих менее компактным представлением.
Кодировка в типе данных hierarchyid ограничена 892 байтами. Следовательно, узлы, имеющие слишком много уровней, чтобы уместиться в 892 байта, не могут быть представлены типом данных hierarchyid.
Тип данных hierarchyid доступен клиентам среды CLR в виде типа данных SqlHierarchyId.
Замечания
Тип данных hierarchyid логически кодирует сведения об одном узле в дереве иерархии, кодируя путь от корня дерева к этому узлу. Такой путь логически представлен в виде последовательности меток всех посещенных дочерних узлов, начиная с корня. Представление начинается косой чертой, а путь к корню представлен одной косой чертой. Для уровней ниже корня каждая метка кодируется в виде последовательности целых чисел, разделенных точками. Сравнения дочерних узлов выполняется путем сравнения этих целочисленных последовательностей, разделенных точками, в лексикографическом порядке. Уровни разделяются косой чертой. То есть косая черта отделяет родительский узел от дочернего. Например, следующие пути с длиной 1, 2, 2, 3 и 3 уровня соответственно действительны для типа hierarchyid.
/
/1/
/0.3.-7/
/1/3/
/0.1/0.2/
Узлы можно вставлять в любое место. Узлы, вставленные после /1/2/, но перед /1/3/, можно представить как /1/2.5/. Узлы, вставленные после 0, логически представлены в виде отрицательных чисел. Например, узел, расположенный перед узлом /1/1/, можно представить как /1/-1/. Узлы не должны начинаться с нулей. Например, узел /1/1.1/ является допустимым, а узел /1/1.01/ — недопустим. Чтобы избежать ошибок, вставляйте узлы с помощью метода GetDescendant.
Преобразование типов данных
Тип данных hierarchyid можно преобразовать в другие типы следующим образом.
Для преобразования значения типа данных hierarchyid в логическое представление типа данных nvarchar(4000) используется метод ToString().
Для преобразования типа данных hierarchyid в тип varbinary используются методы Read () и Write ().
Чтобы передать параметры типа данных hierarchyid по протоколу SOAP, вначале нужно преобразовать их в строки.
Обновление баз данных
При обновлении базы данных до SQL Server 2012 автоматически устанавливается новая сборка и тип данных hierarchyid. Помощник по обновлению обнаружит все пользовательские типы данных или сборки с конфликтующими именами. Помощник по обновлению посоветует переименовать все конфликтующие сборки и либо переименовать все конфликтующие типы данных, либо использовать в программном коде двухкомпонентные имена для ссылок на существующие определяемые пользователем типы данных.
Если при обновлении базы данных обнаружится пользовательская сборка с конфликтующим именем, эта сборка автоматически переименуется, а база данных переведется в подозрительный режим.
Если во время обновления обнаруживается пользовательский тип данных с конфликтующим именем, никаких специальных шагов не предпринимается. После обновления будут существовать как старый пользовательский тип, так и новый системный тип данных. Пользовательский тип данных будет доступен только с применением двухкомпонентных имен.
Использование столбцов типа данных hierarchyid в реплицированных таблицах
Столбцы с типом данных hierarchyid могут использоваться во всех реплицированных таблицах. Требования к приложению ограничиваются способом репликации, однонаправленным или двунаправленным, и версией SQL Server.
Однонаправленная репликация
Однонаправленная репликация включает репликацию моментальных снимков, репликацию транзакций и репликацию слиянием, в которой изменения не выполняются на подписчике. Способ функционирования столбцов типа данных hierachyid при однонаправленной репликации зависит от версии SQL Server на подписчике.
Издатель SQL Server 2012 может реплицировать столбцы типа данных hierachyid на подписчик SQL Server 2012 без специальных усилий.
Издатель SQL Server 2012 должен преобразовать столбцы hierarchyid для репликации их на подписчике, где запущен SQL Server Compact или одна из предыдущих версий SQL Server. SQL Server Compact и предыдущие версии SQL Server не поддерживают столбцы hierarchyid. При использовании одной из этих версий все равно можно реплицировать данные на подписчик. Для этого следует установить параметр схемы или уровень совместимости репликации (для репликации слиянием), чтобы столбец можно было преобразовать в совместимый тип данных.
Фильтрация столбцов поддерживается в обоих случаях. При этом производится фильтрация столбцов типа данных hierarchyid. Фильтрация строк поддерживается, если фильтр не содержит столбец hierarchyid.
Двунаправленная репликация
Двунаправленная репликация включает репликацию транзакций с обновляемыми подписками, одноранговую репликацию транзакций и репликацию слиянием, при которых изменения выполняются на подписчике. Репликация позволяет настраивать таблицу со столбцами типа данных hierarchyid для двунаправленной репликации. Обратите внимание на следующие требования и рекомендации.
На издателе и подписчике должен работать SQL Server 2012.
Репликация реплицирует данные в виде байтов, не выполняя проверки целостности иерархии.
Иерархия изменений источника (на подписчике или издателе) не поддерживается при репликации этих изменений.
Значения хэша для столбцов типа данных hierarchyid зависят от базы данных, в которой созданы эти столбцы. Поэтому на подписчике и издателе могут создаваться одинаковые значения, но применяются они к разным строкам. Репликация не проверяет это условие, кроме того, не существует встроенного метода секционирования значений столбца типа данных hierarchyid, который имеется для столбцов IDENTITY. Чтобы избежать подобных необнаруживаемых конфликтов, приложения должны использовать ограничения или другие механизмы проверки.
Возможно, что строки, вставленные на подписчике, окажутся потерянными. Родительскую строку на издателе могут удалить. Это приводит к необнаруживаемому конфликту, если строка из подписчика вставляется на издателе.
Фильтры столбцов не могут отфильтровывать столбцы типа данных hierarchyid, имеющие значения, отличные от NULL. Вставка из подписчика приведет к ошибке, поскольку на издателе не существует значений по умолчанию для столбца типа данных hierarchyid.
Фильтрация строк поддерживается, если фильтр не содержит столбец hierarchyid.