PASSWORD 's Blog

用耳朵去聆听,用心来感受

用户操作
[即时聊天] [发私信] [加为好友]
彭为ID:libra01
58670次访问,排名1811(1)好友0人,关注者0
libra01的文章
原创 63 篇
翻译 0 篇
转载 4 篇
评论 65 篇
彭为的公告

网名:PASSWORLD
QQ:3569555
MSN:pwzyp#msn.com
现工作在上海
最近评论
mldstk:wow power leveling
zhangjiajun1982:建议你看看这篇文章对你会有帮助的 http://www.150it.cn/bianchengwendang/VC/865064948.html
lovevirus:持之以恒,这是最重要的,谢谢主人的金玉良言,呵呵,郁闷时期给我一点鼓舞
dugang:兄弟,钱多的好找,不累的难找
骆归:楼主还行,但我想没有这么难,不想多说,帮你顶.
文章分类
收藏
    相册
    爱的足迹
    博客图片
    丑男形象
    Delphi
    ★卢培培★
    Angus Johnson's Delphi Components
    CrazyCock专栏
    flier_lu(有价值的文章)
    Think in Patterns 中文
    午夜听风的代码人生
    抉择不悔's blog
    梁甫吟
    超强的Delphi Tips
    风中之歌
    友情链接
    ===天地弦===
    DigJim 的博客(RSS)
    E步·软件资讯
    hkbarton-delphi
    为艺术为技术(RSS)
    孙辉的BLOG
    张硕(CathyEagle)的BLOG
    成片的大树
    我的另外一个生活博客
    编程手札(RSS)
    (RSS)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 超强存储过程!原作,版权所有!精悍!!! 收藏

    新一篇: 如何获取外部EXE窗口的handle | 旧一篇:  2004年Delphi Informant杂志读者选择奖

     在开发数据库应用程序中,我们经常需要表示多层次关系的数据,譬如:MRP中的BOM,多级别的组织结构,多级的角色关系…… 在数据库中描述这种关系时,我们通常使用父节点指向的方式来设计表结构,譬如对部门的表结构定义如下:

      CREATE TABLE TDepartment
      (
        ParentNo varchar(25),    /* 上级部门编号,如果为NULL则表示当前记录为顶级部门。 */
        DepartmentNo varchar(25) PRIMARY KEY CLUSTERED/* 当前部门编号,主关键字段。 */
        Name  nvarchar(100) NOT NULL,   /* 部门名称。 */
        NameEx  nvarchar(100),    /* 扩展名称。 */
        Remark  nvarchar(500)    /* 备  注。 */
      )

      功能需求:获取指定部门编号及其所属的所有或指定层次的下级部门的记录集。

      在以往的开发中,我们通常是在客户端或者中间层来处理以上需求的,一般是通过编程语言(VB、Delphi、Java/.NET)来处理从数据库返回的记录集,这种方式通常需要从数据库获得整个表的记录,因为我们不能确定给定主键所具有的哪些下级记录,然后再在编程代码中使用递归的方式来获取相关的下级记录。这种使用递归的方式,通常难以避免数据中非法记录所引起的死循环问题(当然,你也可以处理这种问题,只是有些麻烦,而且通常也不够优美)。那么,能不能在数据库中就处理好这个问题呢,这样既能减少不必要的数据传输,又能避免使用递归所带来的负面影响,最好还能自动屏蔽掉非法数据指向的问题(当前记录的父指针字段指向其某个下级记录)。
      呵呵,卖弄完毕,亮出匕首(代码,Transact-SQL/MS-SQLServer 2000):

    /* Copyright all(c) 2004 ZhongFeng, http://blog.csdn.net/SW515 */
    CREATE PROCEDURE dbo.PSelectDepartmentHierarchy
      @DepartmentNo    varchar(25),
      @Depth           int  = -1
    AS
      SET NOCOUNT ON

      DECLARE @TStack TABLE
      (
        Indicator varchar(50)
      )

      DECLARE @Index int
      SET @Index = 0

      INSERT INTO @TStack
        SELECT DepartmentNo
        FROM dbo.TDepartment
        WHERE DepartmentNo LIKE @DepartmentNo

      WHILE @@ROWCOUNT > 0 AND (@Index < @Depth OR @Depth < 0)
      BEGIN
        SET @Index = @Index + 1

        INSERT INTO @TStack
          SELECT DepartmentNo
          FROM dbo.TDepartment
          WHERE
            ParentNo IN (SELECT Indicator FROM @TStack) AND
            
    DepartmentNo NOT IN (SELECT Indicator FROM @TStack)
      END

      SELECT dbo.TDepartment.*
      FROM @TStack AS t
        INNER JOIN dbo.TDepartment ON
          t.Indicator = dbo.TDepartment.DepartmentNo
    GO

     

      OK,打完收工。短小精悍!!!

      你可以使用或部分引用该段代码,不过必须保留以上版权注释部分内容,并注释代码来源,否则将保留追究侵权的权利!


      如果你发现有BUG请来信与我联系(SW515@21cn.com),谢谢合作。

    发表于 2004年08月26日 11:20 AM

    评论

    # 回复:超强存储过程!原作,版权所有!精悍!!! 2004-08-26 1:06 PM pc2s
    如果使用Oracle,则不必这么复杂。Oracle提供递归查询功能,如上面的需求,仅需要一句SQL语句即可轻松实现:

    SELECT ParentNo, DepartmentNo, Name, NameEx, Remark
    FROM TDepartment
    START WITH DepartmentNo=指定的部门编号
    CONNECT BY ParentNo = DepartmentNo;

    当然,本文写的是MS-SQL,这种存储过程相当好。

    发表于 @ 2004年08月26日 17:14:00|评论(loading...)|编辑

    新一篇: 如何获取外部EXE窗口的handle | 旧一篇:  2004年Delphi Informant杂志读者选择奖

    评论

    #Zipeg 发表于2004-12-07 15:03:00  IP: 222.40.215.*
    在Sql 中是不是也可以使用 with recursive 语句来实现。
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 彭为