3

我被要求创建脚本,希望运行它的人提供员工 ID。找到所提供的员工在任何深度监督的所有员工。

我的代码是:

CREATE FUNCTION [dbo].[GetNames] (@V uniqueidentifier)  
RETURNS @OldNames TABLE (EMP_NAME varchar(50))
 AS 
BEGIN
    DECLARE @master uniqueidentifier
    SET @master=(SELECT EMP_Supervisor FROM Employee WHERE EMP_ID=@v)
    IF @master=NULL return

    INSERT INTO @OldNames(EMP_NAME)
        SELECT (SELECT EMP_NAME FROM Employee WHERE EMP_ID = @master)
        FROM Employee
        UNION
        SELECT EMP_NAME FROM GetNames(@master)
     RETURN
END

当我想看看它是否有效时,我执行这个:

SELECT * from GetNames('561e2d88-a747-460f-99e1-cfb1d3d8ca5c')

其中“ 561e2d88-a747-460f-99e1-cfb1d3d8ca5c ”是员工的用户界面,我认为这是一个例外:

超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)。

你能帮我么?提前致谢!!

4

1 回答 1

4

假设您正在使用 SQL Server

看看下面的例子

DECLARE @EmployeeStructure TABLE(
        ID INT,
        Name VARCHAR(MAX),
        ManagerID INT
)

INSERT INTO @EmployeeStructure SELECT 1, 'a', NULL
INSERT INTO @EmployeeStructure SELECT 2, 'b', 1
INSERT INTO @EmployeeStructure SELECT 3, 'c', 1
INSERT INTO @EmployeeStructure SELECT 4, 'd', 2
INSERT INTO @EmployeeStructure SELECT 5, 'e', 2
INSERT INTO @EmployeeStructure SELECT 6, 'f', 2

DECLARE @EmployeeID INT = 2

;WITH Employee AS (
        SELECT  Name, ID
        FROM    @EmployeeStructure e 
        WHERE   ManagerID = @EmployeeID
        UNION ALL
        SELECT  es.Name,
                es.ID
        FROM    Employee e INNER JOIN
                @EmployeeStructure es   ON  e.ID = es.ManagerID
)
SELECT  Name
FROM    Employee
OPTION (MAXRECURSION 0)

SQL 小提琴演示

除此之外,也许看看

使用公用表表达式和使用公用表表达式的递归查询

还,

查询提示 (Transact-SQL)

MAXRECURSION 数

指定此查询允许的最大递归数。number 是介于 0 和 32767 之间的非负整数。指定 0 时,不应用限制。如果未指定此选项,则服务器的默认限制为 100。

在查询执行期间达到指定的或默认的 MAXRECURSION 限制数时,查询将结束并返回错误。

由于此错误,该语句的所有效果都将回滚。如果语句是 SELECT 语句,则可能返回部分结果或不返回结果。返回的任何部分结果可能不包括超出指定最大递归级别的递归级别的所有行。

于 2013-05-10T11:29:45.220 回答