Sybase递归查询(存储过程)
本例为根据机构Id递归查询部门机构的数据,部门表名为DEPT_TEST,数据如下图
存储过程代码如下
CREATE PROCEDURE P_DEPT_RECURSIVE( @department_id decimal(31))
AS
BEGIN
DECLARE @level int, @TempDeptName varchar(64), @name varchar(64), @pid decimal(31)
--递归层级
SET @level = 1
CREATE TABLE #tmpQuery(
id decimal(31) not null,
[level] int null,
TempDeptName varchar(64) null,
pid int null
)
-- 存放最终结果的临时表
CREATE TABLE #tmpResult(
id decimal(31) not null,
[level] int null,
name varchar(64) null,
pid int null
)
SELECT @TempDeptName=name, @pid=pid
FROM DEPT_TEST
WHERE id=@department_id
INSERT INTO #tmpQuery
SELECT @department_id, 1, @TempDeptName, @pid
-- 查询所有子部门机构
WHILE @level > 0
BEGIN
IF EXISTS (SELECT 1 FROM #tmpQuery WHERE [level] = @level)
BEGIN
SELECT TOP 1 @department_id=id, @name = TempDeptName, @pid=pid
FROM #tmpQuery
WHERE [level] = @level
INSERT INTO #tmpResult
SELECT @department_id, @level, @TempDeptName, @pid
DELETE FROM #tmpQuery
WHERE [level] = @level
AND id = @department_id
INSERT INTO #tmpQuery
SELECT id, @level + 1, name, pid
FROM DEPT_TEST
WHERE pid = @department_id
-- @@rowcount上条语句受影响行数,判断是否存还存在下一级子部门机构
IF @@rowcount > 0 SET @level= @level + 1
END
ELSE
BEGIN
SET @level = @level - 1
END
END
SELECT id, name, pid FROM #tmpResult
DROP table #tmpResult
DROP table #tmpQuery
END
执行存储过程
exec P_DEPT_RECURSIVE 1
结果如下图