Sybase递归查询(存储过程)

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

结果如下图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43611145/article/details/88658263
今日推荐