zoukankan      html  css  js  c++  java
  • 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,欢迎对软件团队管理有兴趣的朋友加入

  • 相关阅读:
    JVM运行内存分配和回收
    关于评审--从思想到落地
    从浏览器或者Webview 中唤醒APP
    控制台的艺术(附原理实现)
    深入研究嵌入式web服务器的视频监控应用
    css中url的路径含义及使用
    epoll
    C++中智能指针的设计和使用
    wget命令的使用
    UPNP
  • 原文地址:https://www.cnblogs.com/nick4/p/1655741.html
Copyright © 2011-2022 走看看