with w3schools tutorial stored parametros example español ejemplo create crear con sql-server tsql stored-procedures

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