--一个递归函数,用来寻找目录ID,然后再用这个函数查找内容
----------------------------------------------------------------
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 循环中的游标活动。
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