sql_根据父栏目id获取子栏目

--一个递归函数,用来寻找目录ID,然后再用这个函数查找内容  
----------------------------------------------------------------

-- drop FUNCTION   [dbo].[GetChildElement]       
create    FUNCTION     [ dbo ] . [ GetChildElement ]    
(   
 
@ParentId   int    
)   
RETURNS      
@TMPTable     TABLE      
(   
 ID 
int ,   
 FatherID 
int    
)   
AS    
 
BEGIN    
  
INSERT     INTO     @TMPTable    
  
SELECT    clsId,ParentId    FROM    T_nav_cls    WHERE    clsId    =     @ParentId    

  
DECLARE     @cnt   int    
  
SELECT     @cnt     =     count (clsId)    FROM    T_nav_cls    WHERE    ParentId    =     @ParentId    

  
IF     @cnt     >     0    
   
BEGIN    
    
DECLARE     @itID     int    

    
DECLARE    item_cursor    CURSOR     FOR    
    
SELECT    clsId    FROM    T_nav_cls  WHERE    ParentId    =     @ParentId    

    
OPEN    item_cursor   
     
FETCH     NEXT     FROM    item_cursor   
     
INTO     @itID    

     
WHILE     @@FETCH_STATUS     =     0    
     
BEGIN    
      
INSERT     INTO     @TMPTable    
      
SELECT     *     FROM    GetChildElement( @itID )   
      
FETCH     NEXT     FROM    item_cursor   
      
INTO     @itID    
     
END    
    
CLOSE    item_cursor   
    
DEALLOCATE    item_cursor   
   
END    

  
RETURN      
 
END

 

-- select * from GetChildElement(1)

=======================================================================
CURSOR的用法举例
--声明游标,admin是一个表的名称,该游标标识了该表中的属性名称

DECLARE Column_Name CURSOR FOR SELECT name FROM sys.columns WHERE object_id = object_id('admin');

--打开游标
OPEN Column_Name;
DECLARE @Column_Name VARCHAR(100)

--从游标中获取数据,
FETCH Column_Name INTO @Column_Name

--WHILE循环,遍历游标,当@@FETCH_STATUS为0时,表示游标遍历完毕
WHILE(@@FETCH_STATUS = 0)
BEGIN

 --打印记录
 PRINT(@Column_name)

 --获取下一条记录
 FETCH NEXT FROM Column_Name INTO @Column_Name;
END

--关闭游标
CLOSE Column_Name

--删除游标
DEALLOCATE Column_Name
-------------------------------------------------------------------------------
@@FETCH_STATUS
返回被 FETCH 语句执行的最后游标的状态,而不是任何当前被连接打开的游标的状态。

返回值 描述
0 FETCH 语句成功。
-1 FETCH 语句失败或此行不在结果集中。
-2 被提取的行不存在。


语法
@@FETCH_STATUS

返回类型
integer

注释
由于 @@FETCH_STATUS 对于在一个连接上的所有游标是全局性的,要小心使用 @@FETCH_STATUS 。在执行一条 FETCH 语句后,必须在对另一游标执行另一 FETCH 语句前测试 @@FETCH_STATUS 。在任何提取操作出现在此连接上前,@@FETCH_STATUS 的值没有定义。

例如,用户从一个游标执行一条 FETCH 语句,然后调用一个存储过程,此存储过程打开并处理另一个游标的结果。当控制从被调用的存储过程返回后,@@FETCH_STATUS 反映的是在存储过程中执行的最后的 FETCH 语句的结果,而不是在存储过程被调用之前的 FETCH 语句的结果。

示例
下面的示例用 @@FETCH_STATUS 控制在一个 WHILE 循环中的游标活动。

DECLARE  Employee_Cursor  CURSOR   FOR  
SELECT  LastName, FirstName  FROM  Northwind.dbo.Employees 
OPEN  Employee_Cursor 
FETCH   NEXT   FROM  Employee_Cursor 
WHILE   @@FETCH_STATUS   =   0  
BEGIN  
FETCH   NEXT   FROM  Employee_Cursor 
END  
CLOSE  Employee_Cursor 
DEALLOCATE  Employee_Cursor 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值