39

我正在创建一个存储过程,但是在执行该过程时我得到了特定的错误。

消息 217,级别 16,状态 1,过程 SendMail_Renewapp,第 77 行已超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)。

谁能帮我解决这个问题。

我的程序如下..

`ALTER PROCEDURE [dbo].[SendMail_Renewapp] 
-- Add the parameters for the stored procedure here

AS
BEGIN
declare @xml nvarchar(max)
declare @body nvarchar(max)
declare @currentdate datetime;
declare @ExpDate datetime;
declare @mailsendingdate datetime;
declare @renewtime varchar(10);
    DECLARE @AgencyId int;
DECLARE @ApplicationID int;
declare @emailid varchar(100);

set @currentdate=getdate();


                --Fetching the application details: start--
                DECLARE AppCursor CURSOR FOR 
                Select top 5 applications.ap_id,applications.ap_expiry_date,agency.ag_co_email from applications  join agency on applications.ap_agency_id=agency.ag_id
                 where ap_status='AS' and ap_iame_flag='IA' and ap_expiry_date != '' 
                    OPEN AppCursor
                    FETCH NEXT FROM AppCursor INTO @ApplicationID,@ExpDate,@emailid

                    WHILE @@FETCH_STATUS = 0 
                    BEGIN

                     SET @renewtime = ABS(DATEDIFF(day, @currentdate, @ExpDate))
                            if(@renewtime=180)

                                BEGIN

                                    --SET @xml = CAST(( SELECT [ag_id] AS 'td','',[ag_name] AS 'td','',[ag_co_email] AS 'td','',[ag_mobile] AS 'td'FROM  beesl.dbo.Agency where @renewtime < 180
--FOR XML PATH('tr'), ELEMENTS ) AS NVARCHAR(MAX))

SET @body ='<html>
<body>
   <div>
<div>
<H3>Agencies Details whose payment are still pending for last 3 months</H3>
</div>
<table cellpadding="4" cellspacing="1" bgcolor=#FFFFFF   border=1 rules=none frame=box  > 
<tr  >
<th style=border:1px solid #000000;  align=left bgcolor=#c2c2c2> Agency ID </th>
 <th style=border:1px solid #000000;  align=left bgcolor=#c2c2c2> Agency Name </th> 
<th style=border:1px solid #000000;   align=left bgcolor=#c2c2c2> Agency Email </th> 
<th style=border:1px solid #000000;   align=left bgcolor=#c2c2c2> Contact Number </th> 

</tr>'   
    SET @body = @body + @xml +'</table></div></body></html>'

EXEC msdb.dbo.sp_send_dbmail 
@profile_name='BEE', 
@recipients='emailid@emailid.com', 
@subject='Renew Applications',
--@file_attachments = 'D:\beelogo.png',
@importance= High,
--@body = 'Testing'
@body = @body,
@body_format ='HTML';

                                END


                    FETCH NEXT FROM AppCursor INTO      @ApplicationID,@ExpDate,@emailid
                END
                    CLOSE AppCursor
                    DEALLOCATE AppCursor
                --Fetching the application details: end--


  END`
4

9 回答 9

42

在 END 语句后使用“Go”

于 2015-10-30T16:55:23.920 回答
26

该过程是用它自己的 EXEC 创建的。因此,必须在 EXEC 之前放置一个 GO,以便在执行之前创建/更改该过程。因此,避免了递归。

于 2017-01-25T14:39:28.033 回答
8

使用函数在触发器的开头检查触发器嵌套级别,TRIGGER_NESTLEVEL如果触发器级别大于1,则停止触发器执行动作。

 IF TRIGGER_NESTLEVEL() > 1
     RETURN

错误是由于嵌套级别超过其限制而发生的,因为我们都知道触发器会连续触发并且很难控制触发器的行为。该函数TRIGGER_NESTLEVEL返回嵌套级别,我们可以停止增加嵌套级别。

于 2016-12-16T06:27:19.420 回答
5

删除你的声明的BEGINandENDIF

例子

WHILE @@FETCH_STATUS = 0
BEGIN

    IF @variable
    --NO BEGIN
       --Do this
    --NO END
END
于 2013-08-22T12:28:45.667 回答
3

利用

RETURN

在程序结束时

于 2020-06-10T21:21:39.247 回答
1

好的,所以这个已经很老了,所以我想我会提供正确的答案。您应该在存储过程的顶部添加 SET NOCOUNT ON 并在尝试返回结果(您的最终选择)之前添加 SET NOCOUNT OFF。

如果没有此语句,您的执行会将每个 select 语句视为输出结果。当外部 ADO 或 ADO.NET 尝试调用存储过程并获取结果时,您将收到“超出最大存储过程、函数、触发器或视图嵌套级别(限制 32)”消息。它是你的光标的选择语句,它正在把事情搞砸。

参考:https ://docs.microsoft.com/en-us/sql/t-sql/statements/set-nocount-transact-sql?view=sql-server-ver15

于 2020-05-21T17:20:03.517 回答
0

为RECURSIVE_TRIGGERS更改您的数据库。

如果允许嵌套触发器并且链中的触发器启动无限循环,则超出嵌套级别并且触发器终止。那个时候你确实得到了这个错误。所以简单地运行这个查询。

USE yourdatabase 
 GO
    -- Turn recursive triggers OFF in the database. 
      ALTER DATABASE yourdatabase    
      SET RECURSIVE_TRIGGERS OFF 
GO

希望你的问题能解决。

于 2014-05-08T06:26:21.490 回答
0

我的问题是存储过程,而不是触发器,也没有游标。过程中的EXEC命令是其他答案指出的原因。但是我无法在SSMS v18.5GO的命令之前添加任何位置。EXEC它给了我一个错误。原来嵌套在里面的过程有它自己的 TRY/CATCH 块。在该过程结束时添加GO并不能解决问题。我必须删除那里的 TRY/CATCH 块才能使其正常工作。不确定这只是我还是对其他人有帮助。

于 2020-05-28T21:14:44.253 回答
0

就我而言,问题在于 UPDATE 有 2(两个)存储过程。所以,试着只做一个存储过程。谢谢!

于 2021-03-07T07:03:47.473 回答