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`
Utilisez le "Go" après l'instruction END
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.
Supprimez les BEGIN
et END
pour votre instruction IF
exemple
WHILE @@FETCH_STATUS = 0
BEGIN
IF @variable
--NO BEGIN
--Do this
--NO END
END
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.
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.