sql – 自动生成层次结构值
|
我有一个包含列ID,ParentID和Hierarchy的树表,并希望生成依赖于ParentID的Hierarchy列值.为此,我使用触发器.是否存在生成层次结构列值的更好方法? 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:我查找解决方案,如果可能的话不使用触发器. 解决方法我有不同的方法来回答这两个问题.我通常避免使用触发器,直到它是最后一个选择,因为它在数据库上添加了不必要的开销.触发器和存储过程之间的比较 >可以轻松查看表关系,约束,索引,存储 够了,这就是为什么我更喜欢存储过程.您可以通过代理创建一个作业文件(例如,例如:每隔30分钟或任何其他时间执行).您可以使用该逻辑在该作业文件中插入.通过这种方式,树表中的数据将接近实时. 现在引用创建代理: (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
