2012-11-30 10 views
6

मैं SQL सर्वर 2005 का उपयोग कर रहा हूं। मैंने एक संग्रहीत प्रक्रिया बनाई जो अधिकांश समय काम करता है, लेकिन मुझे एक उदाहरण मिला कि यह वही नहीं है जहां मैं चाहता हूं।संग्रहीत प्रक्रिया में एसक्यूएल त्रुटि कैसे प्राप्त करें

वर्तमान में, कोड इस

if @@error <> 0 
    begin 
    select @message_error = "There was a database error adding product "+ @product + " to product line 
    end 

कहाँ @message_error एक आउटपुट चर रहा है की तरह कुछ नहीं करता है।

तो, मैं select @@error कर सकता हूं और एक संख्या प्राप्त कर सकता हूं, लेकिन मैं वास्तव में एसक्यूएल त्रुटि चाहता हूं।

कुछ की तरह कुछ अरे, मैं ऐसा नहीं कर सका क्योंकि इस कॉलम या जो कुछ भी पर एक एफके बाधा है। मैं MSDN http://msdn.microsoft.com/en-us/library/ms178592(v=sql.90).aspx

पर इस लेख पाया लेकिन यह केवल RAISERROR के साथ कस्टम अपवाद फेंकने के ऊपर जाता है, मैं अपने ही त्रुटि संदेश या अपवाद बनाने के लिए नहीं करना चाहते हैं, मैं सिर्फ जानना चाहता है कि सामान काम नहीं कर रहा चाहते हैं। मैं प्रबंधन स्टूडियो के माध्यम से संग्रहीत प्रक्रिया को निष्पादित कर सकता हूं और सटीक SQL त्रुटि देख सकता हूं, लेकिन साइट से डेटा से मिलान करने और इसे मैन्युअल रूप से डालने की कोशिश करने में यह कठिन है।

मैं आउटपुट वैरिएबल में SQL त्रुटि टेक्स्ट कैसे प्राप्त करूं?

+2

क्या आपने ERROR_MESSAGE http://msdn.microsoft.com/en-us/library/ms190358.aspx पर देखा है? – Romhein

उत्तर

11

यहाँ हिस्सा है एक संग्रहीत प्रक्रिया टेम्पलेट के मैं का उपयोग करें:

/* CREATE PROCEDURE... */ 

DECLARE 
    @ErrorMessage varchar(2000) 
,@ErrorSeverity tinyint 
,@ErrorState  tinyint 

/* Additional code */ 

BEGIN TRY 

/* Your code here */ 

END TRY 

BEGIN CATCH 
    SET @ErrorMessage = ERROR_MESSAGE() 
    SET @ErrorSeverity = ERROR_SEVERITY() 
    SET @ErrorState = ERROR_STATE() 
    RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState) 

    BREAK 
END CATCH 

/* Further cleanup code */ 

ट्राई/कैच ब्लॉक मुश्किल हो, लेकिन बहुत @@ त्रुटि की तुलना में अधिक पूरी तरह से कर रहे हैं कर सकते हैं। सबसे महत्वपूर्ण बात यह है कि आप उनके भीतर विभिन्न error_xxx() फ़ंक्शंस का उपयोग कर सकते हैं। यहां, मैं त्रुटि को फिर से बढ़ाने के लिए पर्याप्त अन्य डेटा के साथ, चर @ErrorMessage में उचित त्रुटि संदेश संग्रहीत करता हूं। यहां से, कई विकल्प उपलब्ध हैं; आप @ErrorMessage को आउटपुट वैरिएबल बना सकते हैं, विशिष्ट त्रुटियों के लिए परीक्षण और संभाल सकते हैं, या अपने स्वयं के त्रुटि संदेशों का निर्माण कर सकते हैं (या मौजूदा लोगों को स्पष्ट करने के लिए समायोजित कर सकते हैं - आप यह जानकर परेशान हो सकते हैं कि आप कितनी बार ऐसा करना चाहते हैं)। अन्य विकल्प themsleves पेश करेंगे।

कुछ स्थितियों में, एसक्यूएल दो त्रुटि संदेशों को वापस वापस फेंक देगा ... और error_message() केवल अंतिम व्यक्ति को पकड़ लेगा, जो आम तौर पर "ऑब्जेक्ट असफल बनाने का प्रयास" जैसा कुछ कहता है, पहली त्रुटि संदेश में दी गई वास्तविक त्रुटि। यह वह जगह है जहां आपका स्वयं का त्रुटि संदेश आता है।

+0

यह वास्तव में एक महान उत्तर है, और मुझे विश्वास नहीं है कि मैंने मूल रूप से एक जवाब स्वीकार करते समय इसे अनदेखा किया था। धन्यवाद! –

+0

मैं किसी अन्य सर्वर पर 'Error_Message() 'को कॉल करता हूं लेकिन इसे पूरा मिलता है !! सर्वर ए पर एक एस द्वारा सर्वर ए पर त्रुटियों को पकड़ने का कोई तरीका है। इस मॉडल में जब सर्वर ए पर उठाए गए त्रुटि को सर्वर ए के कैच ब्लॉक में सर्वर बी से एक एसपी कहते हैं, लेकिन यह काम नहीं करता है! क्यूं कर ? – Behzad

+0

@ खोसरविफर, यह एक जटिल मुद्दा है कि आपको वास्तव में इसे अपने प्रश्न के रूप में पोस्ट करना चाहिए - और एक टिप्पणी के रूप में यहां एक लिंक जोड़ें। –

9

आप सामान्य कोशिश/कैच का उपयोग कर सकते हैं और फिर कैच अनुभाग के भीतर त्रुटि के बारे में अधिक जानकारी बना सकते हैं।

DECLARE @DetailedErrorDesc VARCHAR(MAX) 
BEGIN TRY 

--tsql code goes here 

END TRY 
BEGIN CATCH 

SELECT @DetailedErrorDesc =   
    CAST(ERROR_NUMBER() AS VARCHAR) + ' : '+ 
    CAST(ERROR_SEVERITY() AS VARCHAR) + ' : ' + 
    CAST(ERROR_STATE() AS VARCHAR) + ' : ' + 
    ERROR_PROCEDURE() + ' : ' + 
    ERROR_MESSAGE() + ' : ' + 
    CAST(ERROR_LINE() AS VARCHAR); 

--Now you can decide what to do with the detailed error message....return it or log it etc 

END CATCH 
+0

कमाल! धन्यवाद!! –

3

उपयोग की कोशिश ... पकड़ और पकड़ ब्लॉक में आप ERROR_MESSAGE(), ERROR_LINE(), ERROR_PROCEDURE(), ERROR_STATE(), ERROR_SEVERITY(), ERROR_NUMBER() का उपयोग कर सकते काम करता है

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