use*_*392 23 t-sql sql-server stored-procedures
我正在创建一个存储过程,但在执行该过程时,我收到了特定的错误.
消息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`
Run Code Online (Sandbox Code Playgroud)
小智 35
在END语句后使用"Go"
小智 16
该过程是在其内部使用EXEC创建的.因此,GO必须放在EXEC之前,因此在执行之前将创建/更改过程.因此,避免了RECURSION.
小智 7
使用TRIGGER_NESTLEVEL函数检查触发器开始处的触发器嵌套级别,如果触发器级别大于1,则停止触发器执行操作。
IF TRIGGER_NESTLEVEL() > 1
RETURN
Run Code Online (Sandbox Code Playgroud)
错误是由于嵌套级别超过其限制而发生的,因为我们都知道触发器持续触发并且难以控制触发器的行为。该函数TRIGGER_NESTLEVEL返回嵌套级别,我们可以停止嵌套级别来增加。
删除BEGIN并END为您的IF声明
例
WHILE @@FETCH_STATUS = 0
BEGIN
IF @variable
--NO BEGIN
--Do this
--NO END
END
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
75345 次 |
| 最近记录: |