SQL Server HierarchyID: Как добавить детей без знания идентификатора ребенка? - PullRequest
0 голосов
/ 09 апреля 2019

Из табличной переменной @Toc Мне нужно вставить содержимое в таблицу PE_TableOfContents, которая имеет HIERARCHYID. В PE_TableOfContents будет корневой элемент. Из этого корневого элемента я могу получить корневой ИЕРАРХИД (@rootNode).

Но потом, когда я иду, чтобы вставить дочерние элементы, я не уверен, как создать новый HIERARCHYID, так как я не буду знать идентификатор этого столбца, пока он не будет вставлен.

DECLARE @rootNode HIERARCHYID = (SELECT tocNode from PE_TableOfContents WHERE TocNodeLevel = 0)

INSERT INTO PE_TableOfContents (
    TocNode,
    ... all of the other columns)
SELECT 
    @rootNode.ToString + ???? + '/',
    T... all of the other columns
FROM 
    @Toc T

Я просматриваю все документы для иерархии , и, возможно, я что-то упускаю, но я этого не вижу.

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Одна вещь, которая не сразу очевидна из документации по HierarchyID, это то, что вы можете свободно указывать любые числовые данные, которые вы хотите, в качестве составляющих пути. Мне лично нравится использовать автоматически сгенерированный идентификатор (будь то значение идентификатора или иное). Мне также нравится помещать что-то вроде ParentID в качестве столбца в таблице, так что если что-то идет не так, чтобы поддерживать столбец иерархии в актуальном состоянии, вы можете использовать рекурсивный запрос для его повторной генерации (то есть, чтобы иерархия столбец - это производные данные, которые используются только для повышения эффективности запросов).

Если говорить прямо, допустим, у меня была следующая таблица:

ID      ParentID
================
100       NULL
200       100
300       100
400       200

Я бы вывел столбец иерархии следующим образом:

ID      ParentID   h
=========================
100       NULL     /100/
200       100      /100/200
300       100      /100/300
400       200      /100/200/400

Я не могу придумать, как сделать это без первой вставки строки со значением null для иерархии, если вы используете столбец идентификаторов. Если вы используете Последовательность для выделения идентификатора, вы можете получить значение из последовательности и использовать его как для значения идентификатора, так и для получения иерархии.

0 голосов
/ 09 апреля 2019

Хорошо, после достаточного количества поисков в Google, я нашел хорошее объяснение .

Сначала получите корневой (или родительский) узел:

DECLARE @rootNode HIERARCHYID = (SELECT tocNode FROM PE_TableOfContents WHERE TocNodeLevel = 0)

Затем,получить последний известный дочерний элемент этого корневого (или родительского) узла:

DECLARE @lastNode HIERARCHYID = (SELECT MAX(tocNode) FROM PE_TableOfContents WHERE tocNode.GetAncestor(1) = @rootNode);

Затем выполнить вставку следующим образом:

INSERT INTO PE_TableOfContents (
    TocNode,
    ... all of the other columns)
SELECT         
    @rootNode.GetDescendant(@lastNode, NULL),
    T... all of the other columns
FROM 
    @Toc T
...