2013-08-22 3 views
11

मैं एक स्टोर प्रक्रिया बना रहा हूं लेकिन प्रक्रिया को निष्पादित करते समय मुझे विशेष त्रुटि मिल रही है।अधिकतम संग्रहीत प्रक्रिया, फ़ंक्शन, ट्रिगर, या नेस्टिंग स्तर को पार किया गया (सीमा 32)

संदेश 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='[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

आपके पास घोंसले के कितने स्तर हैं? –

+1

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

उत्तर

4

BEGIN और END निकालें अपने IF बयान

उदाहरण

WHILE @@FETCH_STATUS = 0 
BEGIN 

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

यह मेरे लिए काम करता है। बहुत बहुत धन्यवाद!! क्या आप मुझे बता सकते हैं कि "BEGIN अंत" क्या अंतर बनाता है? –

+1

ईमानदार नहीं होने के लिए। मैं आमतौर पर सी # "{}" के भीतर घुंघराले ब्रेसिज़ की तरह तर्क प्रकार के किसी भी ब्लॉक को लपेटने के लिए BEGIN-END का उपयोग करता हूं। मुझे मिला [यह सवाल] (http://stackoverflow.com/questions/1180279/when-do-i-need-to-use-begin-end-blocks-and-the-go-keyword-in-sql- सर्वर) जो मुझे लगता है कि –

1

RECURSIVE_TRIGGERS के लिए अपने डेटाबेस परिवर्तन के लिए।

यदि नेस्टेड ट्रिगर्स की अनुमति है और श्रृंखला में एक ट्रिगर एक अनंत लूप शुरू करता है, तो घोंसला स्तर पार हो जाता है और ट्रिगर समाप्त हो जाता है। उस समय आपको यह त्रुटि मिलती है। तो बस इस सवाल को चलाओ।

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

आशा है कि आपकी समस्या हल हो जाएगी।

18

उपयोग TRIGGER_NESTLEVEL फ़ंक्शन का उपयोग करके अंत बयान

+0

उत्तर दें कृपया अपना उत्तर दें। – qxg

+0

यह है! इससे बचने के लिए इतना आसान अभी तक दर्दनाक है .. – Rambo3

+0

तो बहुत सारे END कथन हैं (इसलिए मैं हूं), लेकिन मुझे कहां जाना चाहिए?बहुत नीचे (उर्फ अंतिम अंतराल कथन) या प्रत्येक एसपी में मैं एक आईएफ-स्टेटमेंट के अंदर कॉल करता हूं? –

2

चेक ट्रिगर नेस्टिंग स्तर सही ट्रिगर की शुरुआत में के बाद "गो" और ट्रिगर रोक अगर ट्रिगर स्तर से अधिक है कार्रवाई करने के लिए 1.

IF TRIGGER_NESTLEVEL() > 1 
    RETURN 

त्रुटि, घोंसले अपनी सीमा से अधिक स्तर के कारण हो रहा है क्योंकि हम सभी जानते हैं कि ट्रिगर लगातार आग और उसके मुश्किल ट्रिगर की है कि व्यवहार को नियंत्रित करने के लिए। फ़ंक्शन TRIGGER_NESTLEVEL घोंसले का स्तर लौटाता है और हम घोंसले के स्तर को बढ़ाने के लिए रोक सकते हैं।

अगर यह आपकी मदद करता है तो कृपया उत्तर के रूप में चिह्नित करें। धन्यवाद

10

प्रक्रिया इसके अंदर अपने EXEC के साथ बनाई गई है। इसलिए, एक जीईईईईसीईसी के समक्ष रखा जाना चाहिए ताकि प्रक्रिया को निष्पादित करने से पहले बनाया/बदला जा सके। इस प्रकार, रिकर्सन से परहेज।

+0

मैं अपनी संग्रहीत प्रक्रिया के अंदर अपने "परीक्षण" EXEC को टिप्पणी करना भूल गया। यह वास्तव में मेरी समस्या थी, धन्यवाद! – hackingchemist

संबंधित मुद्दे