2013-08-22 36 views
11

Tôi đang tạo quy trình lưu trữ nhưng trong khi thực hiện quy trình, tôi nhận được lỗi cụ thể.Đã vượt quá quy trình lưu trữ, chức năng, kích hoạt hoặc xem mức tối đa được lưu trữ (giới hạn 32)

Msg 217, Cấp 16, Tiểu bang 1, Thủ tục SendMail_Renewapp, Dòng 77 Đã vượt quá quy trình, chức năng, kích hoạt hoặc xem mức tối đa được lưu trữ (giới hạn 32).

Bất kỳ ai cũng có thể giúp tôi giải quyết vấn đề này.

thủ tục của tôi là như sau ..

`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', 
[email protected]_attachments = 'D:\beelogo.png', 
@importance= High, 
[email protected] = '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` 
+0

Bạn có bao nhiêu cấp độ làm tổ? –

+1

http://stackoverflow.com/questions/6615327/what-leads-to-this-strange-sql-behavior –

Trả lời

4

Tháo BEGINEND cho IF tuyên bố của bạn

dụ

WHILE @@FETCH_STATUS = 0 
BEGIN 

    IF @variable 
    --NO BEGIN 
     --Do this 
    --NO END 
END 
+0

Điều đó phù hợp với tôi. Cảm ơn rất nhiều!! Bạn có thể cho tôi biết sự khác biệt "BEGIN END" có làm được gì không? –

+1

Thành thật mà nói không. Tôi thường sử dụng BEGIN - END để bọc bất kỳ khối logic nào giống như các dấu ngoặc nhọn trong C# "{}". Tôi đã tìm thấy [câu hỏi này] (http://stackoverflow.com/questions/1180279/when-do-i-need-to-use-begin-end-blocks-and-the-go-keyword-in-sql- máy chủ) mà tôi cho rằng câu trả lời là –

1

ALTER cơ sở dữ liệu của bạn cho RECURSIVE_TRIGGERS.

Nếu trình kích hoạt lồng nhau được cho phép và kích hoạt trong chuỗi bắt đầu một vòng lặp vô hạn, mức làm tổ bị vượt quá và trình kích hoạt kết thúc. Thời gian đó bạn nhận được lỗi này. vì vậy, chỉ cần chạy truy vấn này.

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

Hy vọng vấn đề của bạn sẽ giải quyết.

18

Sử dụng "Go" sau END tuyên bố

+0

Vui lòng giải thích câu trả lời của bạn. – qxg

+0

Đây là nó! Vì vậy, đơn giản nhưng rất đau đớn nếu tránh .. – Rambo3

+0

SO có rất nhiều báo cáo END (vì vậy tôi), nhưng nơi chính xác tôi nên đặt GO?Ở dưới cùng (hay còn gọi là câu lệnh END cuối cùng) hoặc trong mỗi SP tôi gọi bên trong một câu lệnh IF? –

2

Kiểm tra mức độ kích hoạt làm tổ ngay từ đầu của cò bằng cách sử dụng TRIGGER_NESTLEVEL chức năng và ngăn chặn sự kích hoạt để thực hiện hành động nếu mức giá khống chế lớn hơn 1.

IF TRIGGER_NESTLEVEL() > 1 
    RETURN 

Lỗi xảy ra do mức làm tổ vượt quá giới hạn của nó, vì chúng ta đều biết rằng kích hoạt liên tục kích hoạt và khó kiểm soát hành vi của trình kích hoạt đó. Hàm TRIGGER_NESTLEVEL trả về mức làm tổ và chúng ta có thể dừng mức làm tổ để tăng lên.

Vui lòng đánh dấu là câu trả lời nếu điều này giúp bạn. THANKS

10

Quy trình được tạo bằng EXEC bên trong nó. Do đó, GO phải được đặt trước EXEC để quy trình sẽ được tạo/sửa đổi trước khi thực thi. Do đó, tránh RECURSION.

+0

Tôi quên bình luận trong bài kiểm tra "EXEC" bên trong thủ tục lưu sẵn của tôi. Đây chính là vấn đề của tôi, cảm ơn bạn! – hackingchemist