• SQL Server树型结构数据处理的存储过程


    我们在平常的系统开发中常常会遇到像无限级分类这样的树型结构数据,现提供一个可用的数据库存储过程,可以完成树型结构数据的排序。

    环境:windows7+Sql Server 2008

    说明:下面代码已经转换成Sql server2000的脚本,处理效果如下,看sortname字段结果,代码经过测试。

    创建树型表

    CREATE TABLE [dbo].[categories](
    [category_id] [int] IDENTITY(1,1) NOT NULL,
    [parent_id] [int] NULL,
    [category_name] [varchar](500) NULL,
    CONSTRAINT [PK_categories] PRIMARY KEY CLUSTERED
    (
    [category_id] ASC
    )
    ON [PRIMARY]
    )
    ON [PRIMARY]
    GO

    插入测试数据

    INSERT [dbo].[categories] ([category_id], [parent_id], [category_name]) VALUES (1, 0, CONVERT(TEXT, N'A'))
    INSERT [dbo].[categories] ([category_id], [parent_id], [category_name]) VALUES (2, 0, CONVERT(TEXT, N'B'))
    INSERT [dbo].[categories] ([category_id], [parent_id], [category_name]) VALUES (3, 1, CONVERT(TEXT, N'AA'))
    INSERT [dbo].[categories] ([category_id], [parent_id], [category_name]) VALUES (4, 3, CONVERT(TEXT, N'AAA'))
    INSERT [dbo].[categories] ([category_id], [parent_id], [category_name]) VALUES (5, 2, CONVERT(TEXT, N'BB'))
    INSERT [dbo].[categories] ([category_id], [parent_id], [category_name]) VALUES (6, 1, CONVERT(TEXT, N'AA2'))
    INSERT [dbo].[categories] ([category_id], [parent_id], [category_name]) VALUES (7, 1, CONVERT(TEXT, N'AA3'))
    INSERT [dbo].[categories] ([category_id], [parent_id], [category_name]) VALUES (8, 3, CONVERT(TEXT, N'AAA2'))
    INSERT [dbo].[categories] ([category_id], [parent_id], [category_name]) VALUES (9, 4, CONVERT(TEXT, N'AAA3'))
    INSERT [dbo].[categories] ([category_id], [parent_id], [category_name]) VALUES (10, 2, CONVERT(TEXT, N'BB2'))

    创建存储过程,表中的level为级别深度,通过生成的临时表与分类表关联显示结果。

    CREATE PROCEDURE [dbo].[Get_TreeData]
    AS
    BEGIN
    --创建临时表
    create table #tmp_table (id int,[level] int)

    declare @LevelValue int
    set @LevelValue=0
    insert #tmp_table select 0,@LevelValue
    --将数据写入到临时表
    while @@rowcount>0
    begin
    set @LevelValue=@LevelValue+1
    insert #tmp_table select a.category_id,@LevelValue
    from categories as a,#tmp_table as b
    where a.parent_id=b.[id] and b.[level]=@LevelValue-1
    end
    --select * from #tmp_table
    select a.category_id,a.parent_id,a.category_name,b.[level],
    case
    when a.parent_id=0 then a.category_name else replicate('-',b.[level])+a.category_name
    end as sortname
    from categories as a join #tmp_table as b on a.category_id=b.id
    order by sortname
    return
    END


    作者:Neo.Yan
    出处:http://www.cnblogs.com/Nick4/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    欢迎大家访问我的网站-RedGlove.NET

    软件团队管理QQ交流群:124388576,欢迎对软件团队管理有兴趣的朋友加入

  • 相关阅读:
    706. Design HashMap 实现哈希表
    5. Longest Palindromic Substring 返回最长的回文子串
    8. String to Integer (atoi) 字符串转成整数
    22. Generate Parentheses产生所有匹配括号的方案
    245. Shortest Word Distance III 单词可以重复的最短单词距离
    java之spring之初始spring
    java之hibernate之hibernate缓存
    java之hibernate之hibernate查询
    java之hibernate之加载策略和抓取策略
    java之hibernate之 cascade和inverse
  • 原文地址:https://www.cnblogs.com/nick4/p/1655741.html
Copyright © 2020-2023  润新知