设为首页 收藏本站
查看: 1154|回复: 0

[经验分享] 自动维护路径信息的Sql Server无限级目录表

[复制链接]

尚未签到

发表于 2015-7-4 09:48:18 | 显示全部楼层 |阅读模式
  我做的网站基本上都要用到一个无限级的目录表,用来分门别类组织各种文章类的信息。这个表只有三个字段(Id,ParentId,Name),一直就是这样用也没出现过什么问题。直到昨天,碰到了一个问题。我需要知道某个目录下面所有的子孙目录都有哪些。如果以Id或ParentId来查找的话,只能取得父Id和子Id,却不知道爷爷Id、老爷Id、孙子Id、重孙Id...。
  于是就在博问上发表了问题:http://space.iyunv.com/question/3963/
  有园友提示在表中增加一个路径字段,也有园友给出了程序的实现代码,以循环方式来取得。我觉得在表中记录路径信息在使用当中相对更方便一些,效率可能也更高一些。
  但是要维护这些路径信息也够麻烦的,每次增删改一个目录都要修改牵涉到它的每条记录。于是乎:-) 我就考虑能不能在表上做个触发器,自动完成这些任务呢。
  说干就干,首先修改目录表的结构,增加两个字段(IdPath, NamePath),如下图:
DSC0000.png
  再写一个存储过程。接受一个@Id参数,来更新Id=@Id的目录的路径信息。代码如下:

  
1 CREATE PROCEDURE [dbo].[SetSortPath]
2 @Id    int
3 AS
4 SET NOCOUNT ON;
5
6 DECLARE    @PId        varchar(10),
7     @ParentId    int,
8     @Name        nvarchar(500),
9     @IdPath        varchar(500),
10     @NamePath    nvarchar(500);
11         
12 SET @IdPath='/';
13 SET @NamePath='/';
14 SELECT @PId=[ParentId] FROM [Sort] WHERE [Id]=@Id;
15
16 WHILE (@PId IS NOT NULL)
17 BEGIN
18     SELECT @ParentId=[ParentId], @Name=[Name] FROM [Sort] WHERE [Id]=@PId;
19     
20     SET @IdPath = '/' + @PId + @IdPath;
21     SET @NamePath = '/' + @Name + @NamePath;
22
23     IF(@ParentId  @PId)
24         SET @PId=@ParentId;
25     ELSE
26         SET @PId=NULL;
27 END
28
29 IF(@IdPath='/')
30     UPDATE [Sort] SET [IdPath]=NULL, [NamePath]=NULL WHERE [Id]=@Id;
31 ELSE
32     UPDATE [Sort] SET [IdPath]=@IdPath, [NamePath]=@NamePath WHERE [Id]=@Id;  
  
  最后是给目录表创建一个触发器。任务是每次添加或修改目录,就从inserted表中遍历每条记录,使用上面的存储过程更新它和它的子孙目录。代码如下:

  
1 CREATE TRIGGER [dbo].[Trig_SetPath]
2    ON  [dbo].[Sort]
3    AFTER INSERT, UPDATE
4 AS
5 SET NOCOUNT ON;
6
7 DECLARE @Id     varchar(11);
8
9 DECLARE    cur_Inserted CURSOR FOR SELECT [Id] FROM Inserted;    --从Inserted表创建游标
10 OPEN cur_Inserted;
11
12 FETCH FROM cur_Inserted INTO @Id;
13 WHILE(@@Fetch_Status=0)
14 BEGIN
15
16     EXEC [SetSortPath] @Id=@Id;    --更新自身
17
18     DECLARE cur_Sort CURSOR FOR SELECT [Id] FROM [Sort] WHERE [IdPath] LIKE '%/'+@Id+'/%';    --以所有子孙目录创建游标
19     OPEN cur_Sort;
20     FETCH FROM cur_Sort INTO @Id;
21     WHILE(@@Fetch_Status=0)
22     BEGIN
23         EXEC [SetSortPath] @Id=@Id;    --更新子目录
24         FETCH FROM cur_Sort INTO @Id;
25     END   
26     CLOSE  cur_Sort;
27     Deallocate  cur_Sort;
28
29     FETCH FROM cur_Inserted INTO @Id;
30
31 END
32 CLOSE  cur_Inserted;
33 Deallocate  cur_Inserted;  
  我简单测试了一下,效果还行,支持批量添加和批量修改。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83015-1-1.html 上篇帖子: SQL Server 2008 数据挖掘算法 下篇帖子: 【原创·教程·连载】Microsoft SQL Server 2008 Reporting Services应用系列(二)开发篇(上)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表