2013-02-22 48 views
7

नहीं मिला है मैंने एक संग्रहित प्रक्रिया बनाई है जो डेटा को संशोधित करने के लिए कई आदेश चलाती है। अगर सबकुछ सफल होता है तो मैं केवल लेनदेन करना चाहता हूं। मैं नीचे ढंग से एक कोशिश पकड़ ब्लॉक का उपयोग (जहां असली बात में मेरा कैच ब्लॉक RAISERROR का उपयोग करता त्रुटि संदेश वापस जाने के लिए) द्वारा इस कर रहा हूँ:एसक्यूएल: कोशिश करें/कैच को किसी तालिका तक पहुंचने का प्रयास करते समय कोई त्रुटि नहीं मिलती है, जिसे

BEGIN TRY 
    BEGIN TRANSACTION 
    UPDATE Table1 SET MyVarcharColumn = 'test' 
    UPDATE Table2 SET MyBitColumn = 1 
    UPDATE Table3 SET MyIntColumn = 42 
    COMMIT TRANSACTION 
END TRY 
CATCH 
    ROLLBACK TRANSACTION 
END CATCH 

इस तरह मैं यह करना चाहते हैं काम करता है। यदि, उदाहरण के लिए, मैंने MyBitColumn को 1 के बजाय 'बी' पर सेट किया है, त्रुटि पकड़ी जाती है, कैच पर नियंत्रण प्रवाह होता है, और लेनदेन नहीं किया जाता है।

एक मुद्दा मैंने देखा है कि यदि कहें, तालिका 3 डेटाबेस में मौजूद नहीं है तो यह त्रुटियों (अमान्य वस्तु का नाम) त्रुटिपूर्ण है, लेकिन कैच ब्लॉक कभी निष्पादित नहीं होता है और लेनदेन खुला रहता है।

मैं किसी भी (दूरस्थ) संभावना का ख्याल रखने के लिए इसे संभालना चाहता हूं कि डेटाबेस संशोधित हो जाता है (या कुछ ऐसा होता है जहां यह संग्रहित प्रक्रिया ठीक से जोड़ दी जाती है, लेकिन तालिकाओं में से कोई नहीं है)।

मुझे इन त्रुटि मामलों को कैसे संभालना चाहिए?

- किसी भी मदद के लिए धन्यवाद।

उत्तर

9

अपनी स्क्रिप्ट के शुरू में उपयोग करने SET XACT_ABORT

SET XACT_ABORT ON 

जब सेट XACT_ABORT के चालू होने पर यदि एक Transact SQL कथन एक रन-टाइम त्रुटि को जन्म देती है, पूरे लेन-देन समाप्त और वापस लुढ़का है।

मुझे नहीं लगता कि संभव होने जा रहा है है: जब वे के रूप में प्रयास करें ... पकड़ने निष्पादन का एक ही स्तर पर होते हैं

त्रुटियों एक कैच ब्लॉक द्वारा नियंत्रित नहीं कर रहे हैं के निम्नलिखित प्रकार निर्माण:

  • सिंटैक्स त्रुटियों जैसे संकलन त्रुटियां, जो बैच को चलने से रोकती हैं।

  • त्रुटियां जो बयान स्तरीय रखता दौरान हो, ऐसी वस्तु नाम संकल्प त्रुटियों कि टाल नाम संकल्प की वजह से संकलन के बाद हो के रूप में।

Ref

निम्न उदाहरण दिखाता है कि कैसे एक वस्तु नाम संकल्प त्रुटि एक SELECT कथन द्वारा उत्पन्न TRY द्वारा पकड़ा नहीं है ... पकड़ने निर्माण, लेकिन कैच ब्लॉक द्वारा पकड़ा जाता है जब एक ही कथन का चयन एक के अंदर निष्पादित किया जाता है संग्रहीत प्रक्रिया।

USE AdventureWorks2012; 
GO 

BEGIN TRY 
    -- Table does not exist; object name resolution 
    -- error not caught. 
    SELECT * FROM NonexistentTable; 
END TRY 
BEGIN CATCH 
    SELECT 
     ERROR_NUMBER() AS ErrorNumber 
     ,ERROR_MESSAGE() AS ErrorMessage; 
END CATCH 

त्रुटि पकड़ा नहीं है और नियंत्रण TRY से बाहर गुजरता है ... पकड़ने अगले उच्च स्तर के लिए निर्माण।

+0

धन्यवाद। यह उपयोगी है कि सेटिंग जो लेनदेन को वापस रोल करने का कारण बनती है। हालांकि, यह अभी भी त्रुटि के बाद कैच ब्लॉक में क्या निष्पादित नहीं करता है। यह मेरे आवेदन के लिए काम करता है (चूंकि त्रुटि किसी भी तरह से पारित हो जाती है) लेकिन अगर कोई यह सुनिश्चित करने की कोशिश कर रहा था कि कैच ब्लॉक अन्य कारणों से निष्पादित करता है तो यह ऐसा नहीं करेगा। – Luke

+0

आह, समझ गया, वे उस मामले में उन प्रकार की त्रुटियों के लिए पकड़े नहीं गए हैं। धन्यवाद! – Luke

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

  • कोई संबंधित समस्या नहीं^_^