Существует ли практический способ использовать hierarchyID тип данных в платформе объекта 4?

Как есть теперь, UDTs CLR включая HierarchyID не поддерживаются в Платформе Объекта 4. HierarchyID.ToString () полезен, но ломается, после того как любой объект имеет 10 + одноуровневые элементы (базовая структура является/3/4/12/или/3/4/2/, таким образом, 12-й узел отсортирует перед 2-м узлом).

Немного больше о потенциальных опциях:

  • Возвратите hierarchyID как varbinary и реализуйте моего собственного двоичного сортировщика

  • Возвратите hierarchyID как varbinary и реализуйте мой собственный hierarchyID.ToString () метод, который заполняет числа нулями при создании строки, таким образом, получившая строка является поддающейся сортировке (т.е. "/0003/0004/0012 /"). Я disassebled Microsoft.SqlServer.Types.dll и посмотревший реализация. Похоже, что меж-Альс базируется класса под названием "OrdTree", и я мог использовать тот класс в качестве основания для переопределения.

  • Запишите мой собственный тип CLR, чтобы SQL работал над двоичными данными, и создайте его собственную строку (изменение опции 2). Хотя, идет с добавленной головной болью развертывания.

  • Запишите SQL udf, чтобы проанализировать строку иерархии и заполнить ее на уровне DB. Отсутствие/regex's обработки матриц походит на самую большую проблему здесь.

  • Вид hierarchyID на слое базы данных и использовании ROW_NUMBER () функционирует как помогание для порядка сортировки.

  • Запишите некоторые вспомогательные методы для слоя .NET, которые повторно анализируют hierarchyId. ToString () и генерируют поддающуюся сортировке строку (т.е. "/0003/0004/0012 /").

Таким образом, мой вопрос - кто-либо, работал вокруг ограничения? Вы использовали какую-либо из вышеупомянутых стратегий? Если так, как?

14
задан EBarr 27 July 2010 в 20:51
поделиться

1 ответ

Ну, похоже, я получаю просмотры, но не получаю ответов. Мне срочно нужно было поработать с иерархической структурой над SQL, поэтому я собрал статический вспомогательный класс. Я не считаю это законченным решением, но пока оно работает относительно хорошо. PadPath здесь действительно важная функция.

public static class SQLHierarchyManipulatin {
    const int   DEFAULT_PAD_LEN     = 3;
    const char  DEFAULT_PAD_CHAR    = '0';

    public static string PadPath(string Hierarchy) {
        return PadPath (Hierarchy, DEFAULT_PAD_LEN);
    }       
    public static string PadPath(string Hierarchy, int padLen) {
        string[]    components  = Hierarchy.Split('/');

        for (var i = 0; i < components.Length; i++ ) {
            if (components[i] != "") {
                components[i] = components[i].PadLeft(padLen, DEFAULT_PAD_CHAR);
            }
        }
        return string.Join("/", components);
    }

    public static int CurrentNodeIndex(string Hierarchy) {
        string[]    components  = Hierarchy.Split('/');
        string      startItem   = components[components.Length - 2]; //one slot back from trailing slash

        return int.Parse(startItem);
    }

    public static string ParentPath (string Hierarchy) {
        return  Hierarchy.Substring(0, Hierarchy.TrimEnd('/').LastIndexOf('/') + 1);
    }

    public static string AppendChildWithPadding (string Hierarchy, int childIndex, int padLen) {
        return AppendChild(Hierarchy, childIndex, DEFAULT_PAD_LEN);
    }
    public static string AppendChildWithPadding (string Hierarchy, int childIndex) {
        return AppendChild(Hierarchy, childIndex, DEFAULT_PAD_LEN);
    }
    public static string AppendChild (string Hierarchy, int childIndex) {
        return AppendChild(Hierarchy, childIndex, DEFAULT_PAD_LEN);
    }
    public static string AppendChild (string Hierarchy, int childIndex, int padLen) {
        return Hierarchy + childIndex.ToString().PadLeft(padLen, DEFAULT_PAD_CHAR) + "/";
    }
}

Надеюсь, это кому-то поможет! Хотя я все равно хотел бы услышать от людей.

4
ответ дан 1 December 2019 в 16:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: