【问题标题】:how to deal with "Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32)."如何处理“超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)”。
【发布时间】:2013-05-10 11:22:51
【问题描述】:

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

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

【问题讨论】:

  • 您使用的是什么数据库?在存储过程中使用递归肯定会遇到麻烦,而且是一个糟糕的设计。您正在寻找的是一种在层次结构中搜索的方法。有多种方法可以做到这一点,其中一些取决于您使用的特定 SQL 方言
  • stackoverflow.com/questions/959804/… (这似乎是 SQL 服务器考虑使用与示例链接中的语句
  • 无论如何,员工->经理层次结构似乎非常不寻常,有 32 个级别。确定数据中没有循环?
  • 我正在使用 SQL Server 给了我一个数据库并要求创建脚本,该脚本期望运行它的人提供员工 ID。正如我之前所写的,找到所提供的员工在任何深度监督的所有员工。雇员表是这样的: CREATE TABLE [dbo].[Employee]( [EMP_ID] [uniqueidentifier] NOT NULL, [EMP_Name] [nvarchar](100) NOT NULL, [EMP_DateOfHire] [datetime] NOT NULL, [EMP_Supervisor] [唯一标识符] NULL)

标签: sql sql-server stored-procedures


【解决方案1】:

假设您正在使用 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 语句,部分结果或没有结果 可能会被退回。返回的任何部分结果可能不包括所有行 在超出指定最大递归级别的递归级别上。

【讨论】:

  • 这是一个很好的例子,但是 id 和 manager 类型是 uniqueidentifier 而不是 int..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2022-07-20
  • 1970-01-01
  • 2014-04-10
  • 2016-10-14
  • 2016-08-03
相关资源
最近更新 更多