SQL Server 2005 中的树形数据处理示例-1

原创 2005年07月27日 16:55:00

SQL Server 2005 中的树形数据处理示例

-- 创建测试数据

if exists (select * from dbo.sysobjects where id = object_id(N'[tb]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [tb]
GO

-- 示例数据
create table [tb]([id] int PRIMARY KEY,[pid] int,name nvarchar(20))
INSERT [tb] SELECT  1,0,N'中国'
UNION  ALL  SELECT  2,0,N'美国'
UNION  ALL  SELECT  3,0,N'加拿大'
UNION  ALL  SELECT  4,1,N'北京'
UNION  ALL  SELECT  5,1,N'上海'
UNION  ALL  SELECT  6,1,N'江苏'
UNION  ALL  SELECT  7,6,N'苏州'
UNION  ALL  SELECT  8,7,N'常熟'
UNION  ALL  SELECT  9,6,N'南京'
UNION  ALL  SELECT 10,6,N'无锡'
UNION  ALL  SELECT 11,2,N'纽约'
UNION  ALL  SELECT 12,2,N'旧金山'
GO

-- 查询指定id的所有子

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_cid]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_cid]
GO
-- =====================================================
-- 查询指定id的所有子
-- 邹建 2005-07(引用请保留此信息)

-- 调用示例

/*--调用(查询所有的子)
    SELECT A.*,层次=B.[level] 
    FROM [tb] A,f_cid(2)B
    WHERE A.[id]=B.[id]
--*/
-- =====================================================
CREATE FUNCTION f_cid(@id int)
RETURNS TABLE
AS
RETURN(
    WITH ctb([id],[level])
    AS(
        SELECT [id],1 FROM [tb]
        WHERE [pid]=@id
        UNION ALL
        SELECT A.[id],B.[level]+1
        FROM [tb] A,ctb B
        WHERE A.[pid]=B.[id])
    SELECT * FROM ctb
    --如果只显示最明细的子(下面没有子),则将上面这句改为下面的
--    SELECT * FROM ctb A
--    WHERE NOT EXISTS(
--        SELECT 1 FROM [tb] WHERE [pid]=A.[id])
)
GO

--调用(查询所有的子)
SELECT A.*,层次=B.[level] 
FROM [tb] A,f_cid(2)B
WHERE A.[id]=B.[id]
GO

-- 查询指定id的所有父

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_pid]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_pid]
GO
-- =====================================================
-- 查询指定id的所有父
-- 邹建 2005-07(引用请保留此信息)

-- 调用示例

/*--调用(查询所有的父)
    SELECT A.*,层次=B.[level] 
    FROM [tb] A,[f_pid](2)B
    WHERE A.[id]=B.[id]
--*/
-- =====================================================
CREATE FUNCTION [f_pid](@id int)
RETURNS TABLE
AS
RETURN(
    WITH ptb([id],[level])
    AS(
        SELECT [pid],1 FROM [tb]
        WHERE [id]=@id
            AND [pid]<>0
        UNION ALL
        SELECT A.[pid],B.[level]+1
        FROM [tb] A,ptb B
        WHERE A.[id]=B.[id]
            AND [pid]<>0)
    SELECT * FROM ptb
)
GO

--调用(查询所有的父)
SELECT A.*,层次=B.[level] 
FROM [tb] A,[f_pid](7)B
WHERE A.[id]=B.[id]
GO

-- 树形分级显示


if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_id]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_id]
GO
-- =====================================================
-- 级别及排序字段(树形分级显示)
-- 邹建 2005-07(引用请保留此信息)

-- 调用示例

/*--调用实现树形显示

    --调用函数实现分级显示
    SELECT N'|'+REPLICATE('-',B.[level]*4)+A.name
    FROM [tb] A,f_id()B 
    WHERE a.[id]=b.[id]
    ORDER BY b.sid

    --当然,这个也可以根本不用写函数,直接排序即可
    WITH stb([id],[level],[sid])
    AS(
        SELECT [id],1,CAST(RIGHT(10000+[id],4) as varchar(8000))
        FROM [tb]
        WHERE [pid]=0
        UNION ALL
        SELECT A.[id],B.[level]+1,B.sid+RIGHT(10000+A.[id],4)
        FROM [tb] A,stb B
        WHERE A.[pid]=B.[id])
    SELECT N'|'+REPLICATE('-',B.[level]*4)+A.name
    FROM [tb] A,stb B 
    WHERE a.[id]=b.[id]
    ORDER BY b.sid    
--*/
-- =====================================================
CREATE FUNCTION f_id()
RETURNS TABLE
AS
RETURN(
    WITH stb([id],[level],[sid])
    AS(
        SELECT [id],1,CAST(RIGHT(10000+[id],4) as varchar(8000))
        FROM [tb]
        WHERE [pid]=0
        UNION ALL
        SELECT A.[id],B.[level]+1,B.sid+RIGHT(10000+A.[id],4)
        FROM [tb] A,stb B
        WHERE A.[pid]=B.[id])
    SELECT * FROM stb
)
GO

--调用函数实现分级显示
SELECT N'|'+REPLICATE('-',B.[level]*4)+A.name
FROM [tb] A,f_id()B 
WHERE a.[id]=b.[id]
ORDER BY b.sid
GO

Microsoft SQL Server 2005简体中文开发版下载说明

Microsoft SQL Server 2005简体中文开发版下载 正 文:     由于飘易手里有项目需要用到Microsoft SQL Server 20...
  • haiross
  • haiross
  • 2014年06月26日 14:02
  • 1813

SQL Server 2005 最大容量规范

 SQL Server 2005 数据库引擎对象 最大大小/数量 SQL Server 2005(32 位) 最大大小/数量 SQL Server 2005(64 位) ...
  • cxzhq2002
  • cxzhq2002
  • 2014年05月27日 16:37
  • 763

【SQL Server】SQL2005的安装与配置、简单使用

印象中,以前电脑不发达,自身编程经历不多的时候,由于Microsoft SQL Server版本众多,在不同版本的windows下必须要求装相应版本的SQL Server,否则有可能出现兼容性的问题,...
  • yongh701
  • yongh701
  • 2015年12月29日 20:30
  • 7751

win7系统安装SQL Server 2005开发版步骤详解

win7系统安装SQL Server 2005开发版步骤详解 来自大牛:http://www.cnblogs.com/icewee/articles/2019783.html 补充知识:虚...
  • zhangdong305
  • zhangdong305
  • 2015年04月27日 22:55
  • 1335

SQL Server 2005 在局域网中共享数据库——Sql Server 2005的1433端口打开和进行远程连接

http://blog.163.com/kewangwu%40126/blog/static/867284712009101972828708/     如何打开sql server2005的1...
  • zunguitiancheng
  • zunguitiancheng
  • 2014年12月17日 18:04
  • 458

SqlServer2005分页方案,很实用,很快!

1、为什么要使用row方案: 在oracle里有row_number虚列, mySql有limit关键字分页, 他们都有一个比较通用的分页方案, 使得hibernate等类似的程序可以拼接sq...
  • johennes
  • johennes
  • 2013年06月21日 16:51
  • 851

《SQL Server 2005 编程入门经典》学习笔记

第一章 RDBMS基础:SQL Server数据库构成 数据库中的对象 数据库管理系统中包含许多对象。对于SQL Server,它常包含以下重要的数据库对象: 数据库 索引 事务日志 程序集 表 ...
  • hehe6378
  • hehe6378
  • 2014年03月03日 18:01
  • 1132

sql server2005完全卸载与重装

注意: (1)该网站提供的msicuu2.exe和SRVINSTW.exe文件貌似有病毒,请自行搜索下载。msicuu2.exe 大约351kb ,SRVINSTW.exe 大约28 kb。msic...
  • linghao00
  • linghao00
  • 2013年02月15日 10:15
  • 18045

WIN7 32/64位安装SQL Server 2005详细步骤(图文)

由于工作需要,今天要在电脑上安装SQL Server 2005。以往的项目都是使用Oracle,MS的数据库还真的没怎么用过,安装Oracle已经轻车熟路,但装SQL Server好像还有点小麻烦,所...
  • lianghaim
  • lianghaim
  • 2014年09月13日 18:07
  • 3937

Sql server 2005日志文件太大,使其减小的方法

Sql server 2005日志文件太大,使其减小的方法   Sqlserver2005日志文件太大,使其减小的方法:  运行下面的三行 dbName为数据库名:  ...
  • kingmax54212008
  • kingmax54212008
  • 2013年04月12日 16:52
  • 10625
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL Server 2005 中的树形数据处理示例-1
举报原因:
原因补充:

(最多只允许输入30个字)