微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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分钟或任何其他时间执行).您可以使用该逻辑在该作业文件中插入.通过这种方式,树表中的数据将接近实时.

现在引用创建代理:
http://msdn.microsoft.com/en-us/library/ms191128(v=sql.90).aspx
http://msdn.microsoft.com/en-us/library/ms181153(v=sql.105).aspx

原文地址:https://www.jb51.cc/mssql/76771.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐