【问题标题】:maximum stored procedure, function, trigger, or view nesting level exceeded超出最大存储过程、函数、触发器或视图嵌套级别
【发布时间】:2018-01-06 05:13:46
【问题描述】:

我收到以下错误:

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

我可以在其他线程中看到它与您需要添加的内容有关。我不知道如何做到这一点,并注意到它是一个递归过程。任何想法如何解决这个问题?

ALTER PROCEDURE [dbo].[SetMigrate]
    (@DirId uniqueidentifier,
     @Source nvarchar(255),
     @Recursive bit)
AS
    DECLARE @IsRoot AS BIT

    SELECT @IsRoot = IsMigrationRoot 
    FROM directories 
    WHERE folderid = @DirId

    IF (@IsRoot = 1)
    BEGIN
        RETURN 
    END

    UPDATE directories  
    SET migrate = 1, [source] = @Source 
    WHERE folderid = @DirId

    IF (@Recursive = 0)
    BEGIN
        RETURN
    END

    DECLARE @parentid uniqueidentifier, @directoryid uniqueidentifier

    DECLARE Directories cursor local read_only for 
         SELECT FolderID, ParentFolderID 
         FROM directories 
         WHERE ParentFolderID = @DirId

    OPEN Directories

    FETCH NEXT FROM Directories INTO @directoryid, @parentid

    WHILE @@FETCH_STATUS = 0 
    BEGIN
        --print @Path
        EXEC SetMigrate @directoryid, @Source, @Recursive

        FETCH NEXT FROM Directories INTO @directoryid, @parentid
    END

    CLOSE Directories
    DEALLOCATE Directories
GO

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    首先删除 if 语句的开头和结尾。还要确保您已更改数据库以允许 recursive_triggers。

    【讨论】:

    • 感谢您的回复。它适用于某些执行,因此数据库必须允许它(它是一个 azure sql 服务器)。我尝试从 if 中删除开始和结束,但结果仍然相同。
    • 看来你不能超过 32. 显然是服务器限制。所以你需要重写一些使用循环和东西的方法
    猜你喜欢
    • 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
    相关资源
    最近更新 更多