我有一个树表列ID
, ParentID
和Hierarchy
,并希望产生Hierarchy
依赖的列值ParentID
。 为此,我使用触发器。 这样做存在更好的方法来产生层次列值?
ALTER TRIGGER [TR_MyTable_BeforInsert] ON [MyTable]
INSTEAD OF INSERT
AS BEGIN
SET NOCOUNT ON;
Declare @Name NVarChar(100),
@ParentID Int
Declare DACategory Cursor For
Select A.Name, A.ParentID
From Inserted A
OPEN DACategory
FETCH NEXT FROM DACategory INTO @Name, @ParentID
While @@FETCH_STATUS=0 Begin
Insert Into MyTable (Name, ParentID, Hierarchy)
Values (@Name, @ParentID, dbo.F_MyTableGetHID(NULL, @ParentID))
FETCH NEXT FROM DACategory INTO @Name, @ParentID
End
Close DACategory
Deallocate DACategory
END
功能:
ALTER FUNCTION [F_MyTableGetHID]
(
@ID int,
@ParentID int
)
RETURNS HierarchyID
AS BEGIN
Declare @RootHID HierarchyID,
@LastHID HierarchyID
IF (@ParentID IS NULL)Begin
Set @RootHID = HierarchyID::GetRoot()
Select @LastHID = Max(Hierarchy) From MyTable Where ParentID IS NULL
End Else Begin
Select @RootHID = Hierarchy From MyTable Where ID = @ParentID
select @LastHID = Max(Hierarchy) From MyTable where ParentID = @ParentID
End
return @RootHID.GetDescendant(@LastHID, NULL)
END
为更新此表也有触发时重新设置层次列ParentID
改变。
什么是这个问题的最佳做法是什么?
编辑1:我仰望解决方案,如果可能,不使用触发器。