2013-01-02 10 views
7

हाय मैं एक संग्रहीत प्रक्रिया लिख ​​रहा हूं जो एक घंटे के शेड्यूल पर नौकरियों का एक बैच निष्पादित करेगा और मैं यह तय करने की कोशिश कर रहा हूं कि त्रुटियों को वापस करना है या उन्हें उठाएं। मान लीजिए कि मैं प्रत्येक नौकरी के अंदर त्रुटियों को लॉग कर रहा हूं जिससे बेहतर प्रदर्शन और रखरखाव हो सकता है?टी-एसक्यूएल रिटर्न त्रुटि कोड बनाम RaiseError

उदा

--with त्रुटि कोड

CREATE PROCEDURE Job1 
AS 
BEGIN 

    BEGIN TRY 
     --Do some work 
    END TRY 
    BEGIN CATCH 
     --log error 
     RETURN 1; --Return 1 for error 
    END CATCH 
    RETURN 0; 

END 

CREATE PROCEDURE USP_BatchJob 
AS 
BEGIN 
    BEGIN TRANSACTION; 

    DECLARE @Error INT; 
    EXEC @Error = Job1; 
    IF @Error <> 0 
     GOTO ErrorHandling; 

    EXEC @Error = Job1; 
    IF @Error <> 0 
     GOTO ErrorHandling; 

    IF @@TRANCOUNT > 0 
     COMMIT TRANSACTION; 

    RETURN; 

ErrorHandling: 
    IF @@TRANCOUNT > 0 
     ROLLBACK; 
END 

उदा RaiseError

CREATE PROCEDURE Job1 
AS 
BEGIN 

    BEGIN TRY 
     --Do some work 
    END TRY 
    BEGIN CATCH 
     --log error 
     RAISERROR(ERROR_MESSAGE(), ERROR_SEVERITY(), ERROR_STATE()); 
    END CATCH 

END 

CREATE PROCEDURE USP_BatchJob 
AS 
BEGIN 
    BEGIN TRANSACTION 
    BEGIN TRY 

    EXEC Job1; 

    EXEC Job1; 

    END TRY 
    BEGIN CATCH 
     IF @@TRANCOUNT > 0 
      ROLLBACK; 
    END CATCH 

    IF @@TRANCOUNT > 0 
     COMMIT TRANSACTION; 

END 

उत्तरार्द्ध शैली कोडिंग के बारे में होने के नाते अधिक maintainable कोड

उत्तर

3

निर्माण करने के लिए लगता है, यह एक धार्मिक मुद्दा हो सकता है। रिटर्न कोड और अपवाद के बीच मुख्य अंतर यह है कि अपवाद कॉल की श्रृंखला को पारित करना जारी रहेगा।

सामान्यतः, मेरे द्वारा लिखे गए कोड में, मैं संग्रहित प्रक्रिया की स्थिति को "एप्लिकेशन त्रुटि" के रूप में वापस करने के लिए वापसी मूल्यों का उपयोग करता हूं। आपके उदाहरण के साथ, 0 का मतलब सफलता है और कुछ और मतलब विफलता है। जब भी मैं वास्तविक कोड में संग्रहीत प्रक्रिया को कॉल करता हूं, तो मेरे पास वापसी मूल्य पर जांच होती है और साथ ही साथ कोई भी नई त्रुटियां उत्पन्न हो सकती हैं। वैसे, SQL सर्वर में, आप "@retval <> 0" के साथ विफलता की जांच नहीं कर सकते हैं, क्योंकि संग्रहित प्रक्रियाएं पूर्ण लौट सकती हैं।

बेशक, अपवाद/डेटाबेस त्रुटियां अभी भी हो सकती हैं। विचार यह है कि जब एक अपवाद पहचाना जाता है, तो यह लॉग और संभाला जाता है। सिस्टम "त्रुटि" एक अनुप्रयोग त्रुटि में बदल जाता है।

एक समस्या जो मैंने सामना की है वह SQL सर्वर एजेंट के साथ बातचीत है। इसके लिए, आप त्रुटि प्रबंधन चरण में "कांटा" में एक त्रुटि उठाना चाहते हैं। यह वापसी मूल्य को देखकर और फिर एक त्रुटि उत्पन्न करके, नौकरी चरण के भीतर आसानी से किया जाता है।

+0

* '... क्योंकि संग्रहीत प्रक्रियाएं पूर्ण वापस लौट सकती हैं' * - यह कथन गलत प्रतीत होता है। [एसक्यूएल सर्वर 2000 रिटर्न मैनुअल] (http://msdn.microsoft.com/en-us/library/aa238375%28v=sql.80%29.aspx) के साथ-साथ [SQL सर्वर 2012 एक द्वारा) द्वारा निर्णय ] (http://msdn.microsoft.com/en-us/library/ms174998%28v=sql.110%29.aspx), SQL सर्वर में संग्रहित प्रक्रिया पूर्ण वापस नहीं आ सकती है। –

+0

यह वास्तव में गलत है। मैंने कोशिश की (एसक्यूएल सर्वर 2012) और इसे प्राप्त किया: 'ReturnNullTest'procedure ने NULL की स्थिति वापस करने का प्रयास किया, जिसकी अनुमति नहीं है। इसके बजाय 0 की स्थिति वापस कर दी जाएगी। हालांकि शेष उत्तर बहुत उपयोगी है। – Davos

+1

@ डेवोस। । । Phrasing सुरुचिपूर्ण है। संग्रहीत प्रक्रियाएं 'NULL' वापस नहीं आती हैं, लेकिन अगर संग्रहीत प्रक्रिया विफल हो जाती है, तो कॉलर द्वारा पता लगाया गया वापसी मान 'NULL' है। या, यदि संग्रहीत प्रक्रिया में कोई 'वापसी' कथन नहीं है। –