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

环境: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

转载于:https://www.cnblogs.com/nick4/archive/2010/01/25/1655741.html

SQL Server树型结构数据处理的存储过程相关推荐

  1. SQL SERVER树状结构排序

    1 1.1 1.2 2 2.1 2.1.1 2.1.2 2.2 2.2.1 假如我们查询到树状结构数据,并要求对其排序,排序效果如上图.实现的思路如下:对每一层的节点按照排序字段排序,同一层节点按照排 ...

  2. dtree和jquery构建树型结构

    对于小型的树型应用来说,dtree是一个不错的选择. 先看一眼dtree给的例子 构造静态树 首先引入css文件和js文件 <link rel="StyleSheet" hr ...

  3. 【唠叨两句】如何将一张树型结构的Excel表格中的数据导入到多张数据库表中...

    小弟昨天遇到一个相对比较棘手的问题,就像标题说的那样.如何将一张树型结构的Excel表格中的数据导入到多张数据库表中,在现实中实际是七张数据库表,这七张表之间有着有着相对比较复杂的主外键关系,对于我这 ...

  4. EF架构~单表一对多集合的插入(树型结构)

    单表一对多关系很常见,它是一种树形结构,如系统菜单表,部门表,分类表,这些都可以做成单表一对多关系,而这些表做成一对多关系后,如果通过EntityFramework进行插入操作时,会很方便,EF会自动 ...

  5. SQL SERVER大话存储结构(2)

    阅读目录(Content) 1 行记录如何存储 1.1 堆表 1.2 聚集索引表格 2 非聚集索引结构 3 非聚集索引键值内容 3.1 堆表上的非聚集索引 3.2 聚集索引表(唯一)的非聚集索引 3. ...

  6. SQL Server修改表结构后批量更新所有视图

    --获取指定SQLServer数据库所有表及视图的字段列表及类型.长度 Select o.Name As ObjectsName , c.name As ColumnsName , t.name As ...

  7. 如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集

    如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?(2006-12-14 09:25:36) 与这个问题具有相同性质的其他描述还包括: 如 ...

  8. mysql 转成树_Mysql树型结构2种方式及相互转换

    Mysql实现树型结构,数据库上常见有2种方式:领接表.预排序遍历树(MPTT). 领接表方式-- 主要依赖于一个 parent 字段,用于指向上级节点,将相邻的上下级节点连接起来,id 为自动递增自 ...

  9. SQL Server 的索引结构实例

    目前SQL Server 的索引结构如下: 这个是聚集索引的存放形式: 非聚集索引的方式如下: 它们是以B+树的数据结构存放的. 相信大家都看过类似的图,但是没有直观的认识,下面举一个实际的例子来说明 ...

  10. SQL Server修改表结构,表和列名加注释说明

    目录 1. SQL Server修改表结构 1.1 添加字段 1.2 删除字段 1.3 删除字段约束或键 1.4 修改字段类型 1.5 修改字段名 1.6 修改表名 2. 表和字段注释说明 2.1 添 ...

最新文章

  1. 下拉列表怎么判断html,判断下拉列表中的值,实现页面跳转,请问这个怎么判断?...
  2. 商汤科技发布迄今最大人脸检测数据集,绝杀Deepfake!
  3. Prim算法生成迷宫
  4. No module named ‘sklearn.utils.linear_assignment_‘
  5. 基于笛卡尔坐标系下的三边定位的研究(TOA方式定位)
  6. windows下 sbulime text 安装less2css踩的几个坑
  7. mplab x ide 中文使用手册_SCI必备利器:翻译又快又准,强推这款超牛X的神器!...
  8. QTCreator2.8.0+Qt Open source 4.8.5环境配置(Win7x64)
  9. PAT 乙级 1001. 害死人不偿命的(3n+1)猜想 (15) Java版
  10. Python之路--协程/IO多路复用
  11. 熬夜总结学了一半的JDBC
  12. 电商营销方式抢购,秒杀Redis原子减decr方法作为剩余库存判断条件的实现方式(1)
  13. [原创]分期还款的名义利率与真实利率
  14. Battleship!
  15. Canvas实现高性能的频谱瀑布图音频频谱图
  16. android自动唤醒屏幕软件下载,抬手唤醒软件下载-抬手唤醒安卓版下载V1.6手机版-西西软件下载...
  17. for of与for in的区别
  18. 如何制作照片马赛克礼物
  19. JAVA COMMON
  20. USACO 2018 January Contest Platinum A: Lifeguards 题解

热门文章

  1. 笔记.cloudflare 的橙色云代理ssl坑
  2. Python 参数解析(getopt模块)
  3. 为什么hashtable中桶的数目都是用质数表示
  4. android的子菜单是否支持嵌套,Android的两种菜单
  5. redis新数据类型-bitmaps
  6. 怎么用计算机弹histheme,来至世界最好的器乐演奏大合集可做音乐素材-Various Artists 2015  (20CD)FLAC/MP...
  7. jack插头_防水连接器航空插头特点
  8. python单位转换编程_[转]Python编程FAQ
  9. java difftime_Java8 日期时间操作
  10. 12. Django基础:模型层及ORM