से RAISERROR प्रलेखन (जोर मेरा):
किसी भी उपयोगकर्ता द्वारा 0 से 18 के बीच गंभीर स्तर निर्दिष्ट किया जा सकता है। 19 से 25 के बीच गंभीरता का स्तर केवल sysadmin निश्चित सर्वर भूमिका या ALTER TRACE अनुमतियों वाले उपयोगकर्ताओं द्वारा निर्दिष्ट किया जा सकता है। 19 से 25 के बीच गंभीरता स्तर के लिए, लॉग विकल्प के साथ की आवश्यकता है।
यह अत्यधिक संभावना है कि आप इन मानदंडों को पूरा नहीं करने वाले प्रिंसिपल को स्क्रिप्ट निष्पादित कर रहे हैं।
उपयोग करने में कुछ भी गलत नहीं है RAISERROR
; आप एक गंभीरता स्तर का उपयोग कर रहे हैं जो अत्यधिक है। मैं स्तर 16 का उपयोग एक त्रुटि के लिए एक डिफ़ॉल्ट के रूप में करता हूं जो उठाया जाता है और अनुक्रम समाप्त हो जाएगा। यदि आप अधिक सटीक होना चाहते हैं, तो आप स्वयं Microsoft द्वारा दिए गए स्तरों का अनुसरण कर सकते हैं:
अब, स्क्रिप्ट के संदर्भ के आधार पर, सभी का उपयोग RAISERROR
करना पर्याप्त नहीं हो सकता है, क्योंकि यह स्क्रिप्ट को अपने आप से "बाहर" नहीं करता है (सामान्य गंभीरता के स्तर का उपयोग करके)।
उदाहरण के लिए:
RAISERROR(N'Test', 16, 1);
SELECT 1; /* Executed! */
यह दोनों एक त्रुटि बढ़ाएगा और परिणाम सेट लौटाएगा।
स्क्रिप्ट को तुरंत समाप्त करने के लिए, मैं उपयोग करना पसंद करता हूं RETURN
( GOTO
आमतौर पर निर्माण का उपयोग करके अधिकांश प्रोग्रामिंग सर्किलों में निराश किया जाता है जहां वैकल्पिक रूप से मौजूद हैं:
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
या त्रुटि का उपयोग करके संभालें TRY/CATCH
, जो CATCH
कि गंभीरता 11 या अधिक होने पर ब्लॉक में कूदने के लिए निष्पादन का कारण बनेगा :
BEGIN TRY
RAISERROR(N'Test', 16, 1);
SELECT 1; /* Not executed */
END TRY
BEGIN CATCH
SELECT 2; /* Executed */
END CATCH
BEGIN TRY
RAISERROR(N'Test', 10, 1);
SELECT 1; /* Executed */
END TRY
BEGIN CATCH
SELECT 2; /* Not executed */
END CATCH
एक अलग समस्या यह है कि यदि स्क्रिप्ट कई बैचों को फैलाती है - RETURN
केवल बैच से बाहर निकल जाएगी :
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
GO
SELECT 2; /* Executed! */
इसे ठीक करने के लिए, आप @@ERROR
प्रत्येक बैच की शुरुआत में देख सकते हैं :
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
GO
IF (@@ERROR != 0)
RETURN;
SELECT 2; /* Not executed */
संपादित करें: जैसा कि मार्टिन स्मिथ टिप्पणियों में सही ढंग से बताते हैं, यह केवल 2 बैचों के लिए काम करता है। 3 या अधिक बैचों का विस्तार करने के लिए, आप त्रुटियों को उठा सकते हैं जैसे (नोट: GOTO
विधि इस समस्या को हल नहीं करती है क्योंकि लक्ष्य लेबल को बैच के भीतर परिभाषित किया जाना चाहिए):
RAISERROR(N'Test', 16, 1);
RETURN;
SELECT 1; /* Not executed */
GO
IF (@@ERROR != 0)
BEGIN
RAISERROR(N'Error already raised. See previous errors.', 16, 1);
RETURN;
END
SELECT 2; /* Not executed */
GO
IF (@@ERROR != 0)
BEGIN
RAISERROR(N'Error already raised. See previous errors.', 16, 1);
RETURN;
END
SELECT 3; /* Not executed */
या, जैसा कि वह बताते हैं, यदि आप अपने वातावरण के लिए उपयुक्त हैं तो आप इस SQLCMD
विधि का उपयोग कर सकते हैं ।