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 中的嵌套级别限制错误的主要内容,如果未能解决你的问题,请参考以下文章
14周翻译:SQL Server安全级别2的阶梯:身份验证 作者:Don Kiely,2014/06/18 该系列 本文是“Stairway系列:SQL Server安全性的阶梯”的一部分 链接