SQL 2008 HierarchyID с несколькими корневыми узлами

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

27
задан Element 30 August 2009 в 01:08
поделиться

3 ответа

Да, вы правильно читаете - использование HierarchyID допускает только один единственный корневой узел. Так оно и есть, и, насколько я знаю, обойти это невозможно, кроме введения искусственного нового «сверхкорня», который не служит никакой другой цели, кроме как позволить вам иметь несколько «подкорней» первого уровня. ...

Marc

Обновление: как указал Грег (@ Greg0) - этот ответ на самом деле неверен - см. Его ответ для более подробной информации.

8
ответ дан 28 November 2019 в 04:52
поделиться

разве у вас не может быть только один "неотображаемый" корень и все основные статьи на уровне 1?

2
ответ дан 28 November 2019 в 04:52
поделиться

Я проводил некоторое тестирование, и оказалось, что вам не нужна запись с корневым иерархическим идентификатором.

Например, обычно вам нужен один корневой узел (уровень 1) и несколько childen, но вы можете пропустить корневой узел, не имеющий корневых записей, только записи, которые начинаются на уровне 2:

//table schema
CREATE TABLE [Entity](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](50) NOT NULL
    [Hierarchy] [hierarchyid] NOT NULL,
 CONSTRAINT [PK_Entity] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

//Insert first 'root', which is technicall a child without a parent
INSERT INTO [Entity]
           ([Name]
           ,[Description]
           ,[Hierarchy])
     VALUES
           ('Root A'
           ,hierarchyid::GetRoot().GetDescendant(NULL,NULL))


//Create the second 'root'
INSERT INTO [Entity]
           ([Name]
           ,[Hierarchy])
     VALUES
           ('Root B'
           ,hierarchyid::GetRoot().GetDescendant((select MAX(hierarchy) from entity where hierarchy.GetAncestor(1) = hierarchyid::GetRoot()),NULL))

Теперь, если вы выберете все строки из таблицы, вы увидите:

SELECT [ID]
      ,[Name]
      ,[Hierarchy],
       [Hierarchy].ToString()
  FROM [Entity]

Иерархия имен идентификаторов (без имени столбца)
1 корень A 0x58 / 1 /
2 Корень B 0x68 / 2 /

Я не уверен, что это будет рекомендованная практика, но концептуально она позволяет иметь несколько корней, если вы рассматриваете 2-й уровень в дереве как корень

29
ответ дан 28 November 2019 в 04:52
поделиться
Другие вопросы по тегам:

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