我被要求创建脚本,期望运行它的任何人提供员工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 ”是员工的ui,我将此作为例外:
你能帮帮我吗?提前致谢!!最大存储过程,函数,触发器或视图嵌套级别 超过(限制32)。
答案 0 :(得分:3)
假设您使用的是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)
除此之外,可以看看
Using Common Table Expressions和Recursive Queries Using Common Table Expressions
此外,
MAXRECURSION编号
指定此查询允许的最大递归数。 number是0到32767之间的非负整数。当0为时 指定,不应用限制。如果未指定此选项,则 服务器的默认限制为100.
达到MAXRECURSION限制的指定或默认数量时 在查询执行期间,查询结束并返回错误。
由于此错误,将回滚该语句的所有效果。 如果语句是SELECT语句,则部分结果或无结果 可能会被退回。返回的任何部分结果可能不包括所有行 在超出指定的最大递归级别的递归级别上。