SQL Server 2014 中的嵌套级别限制错误

Posted

技术标签:

【中文标题】SQL Server 2014 中的嵌套级别限制错误【英文标题】:Nesting level limit error in SQL Server 2014 【发布时间】:2017-11-23 09:29:12 【问题描述】:

我们有以下 SQL Server 存储过程:

ALTER PROCEDURE [dbo].[up_get_id]
    (@KeyName VARCHAR(30), @ID INTEGER OUTPUT)
AS
BEGIN
    DECLARE @SEQ_NAME VARCHAR(120);
    SET @SEQ_NAME = 'seq_dbk_' + @KeyName;

    DECLARE @SQL NVARCHAR(1000);
    SET @SQL = 'set @ID = next value for ' + @SEQ_NAME;

    EXEC sp_executesql @SQL, N'@ID int out', @ID = @ID output;

    RETURN 0;
END
GO

调用存储过程后有时(不总是,可能在高负载下):

declare @P1 int
exec up_get_id  @KeyName = 'KEY', @ID = @P1 output
select @P1 Result

客户端出现错误:

警告:致命错误 217 发生在 20117 年 11 月 21 日下午 12:54。记下错误和时间,并联系您的系统管理员。

此外,SQL Server 日志中还会显示以下消息:

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

你有什么想法吗?

服务器版本:

Microsoft SQL Server 2014 - 12.0.4213.0 (X64)   
Jun 9 2015 12:06:16   
Copyright (c) Microsoft Corporation  
Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

【问题讨论】:

准确写成“limit 2”?显示带有数字和对象的完整 sql 错误 是的,正是“限制 2”,这不是错字。实际上,有 2 条错误消息:第 1 条(由客户端获取):“警告:发生致命错误 217 ...”和第 2 条仅出现在 SQL Server 日志中:“错误:217,严重性:39,状态:16。超出最大存储过程、函数、触发器或视图嵌套级别(限制 2)。" "Severity: 39" 不会在 sql 中发生。查看sql日志 正如我已经说过的,这条消息来自 SQL Server 日志。我同意有两件事很奇怪:1)“限制 2”2)“严重性:39” 【参考方案1】:

- 和未回答的回应:)

如果 COMPATIBILITY_LEVEL 100 及以下错误

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

110 和更多

如果已设置 ROWCOUNT 选项,则无法使用 NEXT VALUE FOR 函数 设置,或者查询包含 TOP 或 OFFSET。

所以你设置 ROWCOUNT 0

【讨论】:

以上是关于SQL Server 2014 中的嵌套级别限制错误的主要内容,如果未能解决你的问题,请参考以下文章

具有双重嵌套级别的 SQL 查询

14周翻译:SQL Server安全级别2的阶梯:身份验证 作者:Don Kiely,2014/06/18 该系列 本文是“Stairway系列:SQL Server安全性的阶梯”的一部分 链接

创建规则以限制sql server中表中的特殊字符

如果嵌套查询在 SQL Server 中是不是有结果,如何返回是或否?

SQL Server安全级别2的楼梯:身份验证

在 SQL Server 中导入和解析大型 XML 文件(当“正常”方法相当慢时)