sql server - w3schools - Se superó el nivel máximo de procedimiento almacenado, función, disparador o vista anidado(límite 32)
stored procedure sql tutorial (5)
ALTERA tu base de datos para RECURSIVE_TRIGGERS .
Si se permiten desencadenantes anidados y un desencadenador en la cadena inicia un ciclo infinito, el nivel de anidamiento se excede y el desencadenante finaliza. Esa vez consigues este error. así que simplemente runa esta consulta.
USE yourdatabase
GO
-- Turn recursive triggers OFF in the database.
ALTER DATABASE yourdatabase
SET RECURSIVE_TRIGGERS OFF
GO
Espero que tu problema se resuelva.
Estoy creando un procedimiento de almacenamiento, pero al ejecutar el procedimiento me sale un error en particular.
Msg 217, nivel 16, estado 1, procedimiento SendMail_Renewapp, línea 77 Procedimiento almacenado máximo, función, desencadenador o nivel de anidación de vista excedido (límite 32).
¿Puede alguien por favor ayudarme a salir de este problema?
Mi procedimiento es el siguiente ..
`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`
Compruebe el nivel de anidamiento del disparador justo al comienzo del desencadenador utilizando la función TRIGGER_NESTLEVEL
y detenga el activador para realizar una acción si el nivel de disparo es mayor que 1.
IF TRIGGER_NESTLEVEL() > 1
RETURN
El error ocurre debido a que el nivel de anidamiento excede su límite, porque todos sabemos que dispara de forma continua y es difícil controlar el comportamiento del gatillo. La función TRIGGER_NESTLEVEL
devuelve el nivel de anidación y podemos detener el aumento del nivel de anidación.
Amablemente marque como respuesta si esto lo ayuda. GRACIAS
El procedimiento se crea con un EXEC de sí mismo dentro de él. Por lo tanto, se debe colocar un GO antes del EXEC para que el procedimiento sea Creado / Alterado antes de ser ejecutado. Por lo tanto, evitando la RECURSIÓN.
Elimine BEGIN
y END
para su declaración IF
ejemplo
WHILE @@FETCH_STATUS = 0
BEGIN
IF @variable
--NO BEGIN
--Do this
--NO END
END
Utilice el "Ir" después de la instrucción END