SQL2005下使用CTE的一个示例

create   table  Tree(nId  smallint , NodeName  nvarchar ( 16 ), pId  smallint )
insert  Tree  select   1 ' 中国 ' NULL
union   all   select   2 ' 北京 ' 1
union   all   select   3 ' 上海 ' 1
union   all   select   4 ' 湖北 ' 1
union   all   select   5 ' 湖南 ' 1
union   all   select   6 ' 武汉 ' 4
union   all   select   7 ' 孝感 ' 4
union   all   select   8 ' 长沙 ' 5
union   all   select   9 ' 岳阳 ' 5
union   all   select   10 ' 海淀区 ' 2
union   all   select   11 ' 朝阳区 ' 2
union   all   select   12 ' 上地 ' 10
union   all   select   13 ' 西三旗 ' 10

go
create   procedure  sp_GetNoedsByRootID
    
@nId   smallint
as
begin     
    
with  NewTree(nId, NodeName, pId)  as
    (
        
select   *   from  Tree  where  nId = @nId
        
union   all
        
select  T. *   from  Tree T  join  NewTree NT  on  T.pId = NT.nId
    )
    
select  NT.nId, NT.NodeName, PT.NodeName  as   [ ParentName ]
    
from  NewTree NT  join  Tree PT  on  NT.pId = PT.nId            
end
go

create   procedure  sp_DelNoedsByRootID
    
@nId   smallint
as
begin
    
declare   @sql   nvarchar ( max )
    
set   @sql = '
                with NewTree(nId, NodeName, pId) as
                (
                    select * from Tree where nId=@nId
                    union all
                    select T.* from Tree T join NewTree NT on T.pId=NT.nId
                )
                delete Tree 
                from Tree T join NewTree NT on T.nId=NT.nId
            
'
    
exec  sp_executesql  @sql , N ' @nId smallint ' @nId
end
go

-- 查找节点及子节点
exec  sp_GetNoedsByRootID  2

-- 删除节点及子节点
exec  sp_DelNoedsByRootID  2
select   *   from  Tree

drop   table  Tree
drop   procedure  sp_GetNoedsByRootID, sp_DelNoedsByRootID

 在SQL2000下实现类似功能的代码:

 

-- 测试数据
CREATE   TABLE  tb(ID  char ( 3 ),PID  char ( 3 ),Name  nvarchar ( 10 ))
INSERT  tb  SELECT   ' 001 ' , NULL  , ' 山东省 '
UNION   ALL   SELECT   ' 002 ' , ' 001 ' , ' 烟台市 '
UNION   ALL   SELECT   ' 004 ' , ' 002 ' , ' 招远市 '
UNION   ALL   SELECT   ' 003 ' , ' 001 ' , ' 青岛市 '
UNION   ALL   SELECT   ' 005 ' , NULL  , ' 四会市 '
UNION   ALL   SELECT   ' 006 ' , ' 005 ' , ' 清远市 '
UNION   ALL   SELECT   ' 007 ' , ' 006 ' , ' 小分市 '
GO

-- 查询指定节点及其所有子节点的函数
CREATE   FUNCTION  f_Cid( @ID   char ( 3 ))
RETURNS   @t_Level   TABLE (ID  char ( 3 ), Level   int )
AS
BEGIN
    
DECLARE   @Level   int
    
SET   @Level = 1
    
INSERT   @t_Level   SELECT   @ID , @Level
    
WHILE   @@ROWCOUNT > 0
    
BEGIN
        
SET   @Level = @Level + 1
        
INSERT   @t_Level   SELECT  a.ID, @Level
        
FROM  tb a, @t_Level  b
        
WHERE  a.PID = b.ID
            
AND  b. Level = @Level - 1
    
END
    
RETURN
END
GO

-- 调用函数查询002及其所有子节点
SELECT  a. *
FROM  tb a,f_Cid( ' 002 ' ) b
WHERE  a.ID = b.ID
/*--结果
ID   PID  Name       
------ ------- ---------- 
002  001  烟台市
004  002  招远市
--
*/
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
教你安装SQL Server 2005示例数据库 安装SQL server 2005时,如果你选择的是默认安装,就不会安装AdventureWorks 数据库。因为许多教程和例子都需要用到AdventureWorks 数据库,所以安装AdventureWorks 数据库非常必要。本文将论述此数据库的获得和安装方法。 下载并安装AdventureWorks 首先,去微软官方网站下载AdventureWorksdb.msi,这是AdventureWorks 的安装程序。然后把此文件和相关文件复制到你的计算机上。AdventureWorksBI.msi(BI即商业智能的缩写)。 运行安装文件,这样这两个数据库就装到了你的计算机上了。但实际上并没有完全完成数据库的安装。有两种方法可以完成安装程序:可以使用sqlcmd,它看起来像是个dos 窗口。或是使用图形界面安装。下面是这两种方法的说明。 方法1 运行SQL Server Management Studio。 单击工具栏右边数第八个按钮来打开 sqlcmd 窗口(图标是一个红色惊叹号)。 在Listing A中输入指令。 execsp_attach_db @dbname=N'AdventureWorks', @filename1=N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorks_Data.mdf',?@filename2=N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\AdventureWorks_log.ldf' 提示:如果没有选择默认安装,则必须输入文件的正确路径。 方法2 此方法通过图形界面来连接数据库。除了保存所输入的内容外,图形界面能用最简单的方式来连接多个数据库。步骤如下: 1、在Object Explorer (项目资源管理器)中选择数据库模式。 2、单击鼠标右键,选择连接到tear-off菜单,打开数据库连接对话框。 3、单击增加按钮,然后确定要增加的数据库位置(也可以一次加入多个数据库)。 连接数据库的注意事项 虽然在 SQL Server 2005中文件的结构已经发生了改变,你仍然可以连接SQL Server 2000 的数据库。但是只有选择数据库的新格式,才能体验到SQL Server 2005 的新特性,你可以任意选择一种方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值