web-dev-qa-db-fra.com

Dépassement du niveau maximal d'imbrication de procédure, de fonction, de déclencheur ou de vue (limite 32)

Je crée une procédure de stockage mais lors de l'exécution de la procédure, j'obtiens l'erreur particulière.

Msg 217, niveau 16, état 1, procédure SendMail_Renewapp, ligne 77 Le niveau maximal d'imbrication de procédure, fonction, déclencheur ou affichage a été dépassé (limite 32).

Quelqu'un peut-il m'aider à résoudre ce problème.

Ma procédure est la suivante ..

`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='[email protected]', 
@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`
22
user2198392

Utilisez le "Go" après l'instruction END

32
user2936035

La procédure est créée avec un EXEC d'elle-même à l'intérieur. Par conséquent, un GO doit être placé avant l'EXEC afin que la procédure soit créée/modifiée avant d'être exécutée. Ainsi, en évitant la RÉCURSION.

16
jmag

Supprimez les BEGIN et END pour votre instruction IF

exemple

WHILE @@FETCH_STATUS = 0
BEGIN

    IF @variable
    --NO BEGIN
       --Do this
    --NO END
END
5
Secret Squirrel

Vérifiez le niveau d'imbrication du déclencheur au début du déclencheur en utilisant TRIGGER_NESTLEVEL fonctionner et arrêter le déclencheur pour exécuter une action si le niveau de déclenchement est supérieur à 1.

 IF TRIGGER_NESTLEVEL() > 1
     RETURN

L'erreur se produit en raison du niveau d'imbrication dépassant sa limite, car nous savons tous que le déclencheur se déclenche en continu et qu'il est difficile de contrôler ce comportement du déclencheur. La fonction TRIGGER_NESTLEVEL renvoie le niveau d'imbrication et nous pouvons arrêter le niveau d'imbrication pour augmenter.

3
M Daim Khan

ALTER votre base de données pour RECURSIVE_TRIGGERS.

Si des déclencheurs imbriqués sont autorisés et qu'un déclencheur de la chaîne démarre une boucle infinie, le niveau d'imbrication est dépassé et le déclencheur se termine. Cette fois, vous obtenez cette erreur. il suffit donc d'exécuter cette requête.

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

J'espère que votre problème sera résolu.

1
Pradeep atkari