如何处理“超出最大存储过程,函数,触发器或视图嵌套级别(限制32)”。

时间:2013-05-10 11:22:51

标签: sql sql-server stored-procedures

我被要求创建脚本,期望运行它的任何人提供员工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)。

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

1 个答案:

答案 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)

SQL Fiddle Demo

除此之外,可以看看

Using Common Table ExpressionsRecursive Queries Using Common Table Expressions

此外,

Query Hints (Transact-SQL)

  

MAXRECURSION编号

     

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

     

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

     

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