Как обновить столбец иерархии - PullRequest
0 голосов
/ 07 октября 2018

У меня есть таблица с именем items, в которой есть отношение родитель / потомок, которую я преобразовываю в иерархию.

Я следовал этому учебнику, чтобы сделать это.

Все шаги учебного пособия, за исключением заключительного оператора обновления.

Я получаю сообщение об ошибке:

Неявное преобразование из иерархии типов данных в nvarchar (max) равноне положено.Используйте функцию CONVERT для выполнения этого запроса.

Но это не имеет смысла.Поле, которое я обновляю - это иерархия, а не nvarchar (nax).Так что я не вижу, где используется поле nvarchar (max).

drop table #children
CREATE TABLE #Children   
   (  
    ID int,  
    TenantId int,
    ParentID int,
    Num int  
);  
GO
CREATE CLUSTERED INDEX tmpind ON #Children(TenantId, ParentID, ID);  
GO

INSERT #Children (ID,  TenantId,ParentID, Num)  
SELECT ID, TenantId, ParentID, 
  ROW_NUMBER() OVER (PARTITION BY TenantId, ParentID ORDER BY ParentId)   
FROM Items  
GO 

SELECT * FROM #Children ORDER BY TenantId, ParentID, Num  
GO


WITH paths(path, ID, ParentId, TenantId)   
AS (  
-- This section provides the value for the root of the hierarchy  
SELECT hierarchyid::GetRoot() AS OrgNode, ID, ParentId, TenantId   
FROM #Children AS C   
WHERE ParentId IS NULL   

UNION ALL   
-- This section provides values for all nodes except the root  
SELECT   
CAST(p.path.ToString() + CAST(C.Num AS varchar(30)) + '/' AS hierarchyid),   
C.ID , C.ParentId, C.TenantId 
FROM #Children AS C   
JOIN paths AS p   
   ON C.ParentID = P.ID   
)
-- This select statement runs just fine and shows expected data.
--Select i.Id as ItemId, p.path, p.path.ToString() as LogicalNode, p.Id, p.ParentId, p.TenantId from Paths P
--join Items I on p.Id = i.Id
--order by P.TenantId, P.path

--Note that I have tried using the convert function, but it still fails with the same error message.
UPDATE I Set OrgNode = Convert(hierarchyid, P.path)
FROM Items I    
JOIN Paths AS P   
   ON I.ID = P.ID  
GO

EDIT Странно, но DBFiddle работает.

enter image description here

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Похоже, что вы решили свою проблему, но я бы предложил сохранить преобразование в иерархию до конца.Например:

WITH paths(path, ID, ParentId, TenantId)   
AS (  
-- This section provides the value for the root of the hierarchy  
SELECT cast('/' as varchar(max)) AS OrgNode, ID, ParentId, TenantId   
FROM #Children AS C   
WHERE ParentId IS NULL   

UNION ALL   
-- This section provides values for all nodes except the root  
SELECT   
CAST(concat(p.path.ToString(), C.Num, '/') AS varchar(max)),   
C.ID , C.ParentId, C.TenantId 
FROM #Children AS C   
JOIN paths AS p   
   ON C.ParentID = P.ID   
)
-- This select statement runs just fine and shows expected data.
--Select i.Id as ItemId, p.path, p.path.ToString() as LogicalNode, p.Id, p.ParentId, p.TenantId from Paths P
--join Items I on p.Id = i.Id
--order by P.TenantId, P.path

--Note that I have tried using the convert function, but it still fails with the same error message.
UPDATE I Set OrgNode = Convert(hierarchyid, P.path)
FROM Items I    
JOIN Paths AS P   
   ON I.ID = P.ID  
GO

Обратите внимание, я также изменил стиль конкатенации + для функции concat(), чтобы вам не пришлось возиться с конвертацией C.Num в varchar.

0 голосов
/ 07 октября 2018

Похоже, столбец OrgNode не относится к типу hierachyid.Вы можете использовать ToString()

UPDATE I Set OrgNode = P.path.ToString()
FROM Items I    
JOIN Paths AS P   
   ON I.ID = P.ID 

или изменить таблицу Items и изменить тип столбца.

...