SQL सर्वर में बैच गर्भपात त्रुटियों की सूची


9

SQL सर्वर में, यदि XACT_ABORT बंद है, तो कुछ त्रुटियां वर्तमान कथन को समाप्त कर देंगी (उदाहरण के लिए किसी संग्रहीत कार्यविधि को पैरामीटर की गलत संख्या की आपूर्ति करना जो कुछ पैरामीटर लेता है) और कुछ त्रुटियां पूरे बैच को निरस्त कर देंगी (उदाहरण के लिए किसी संग्रहित पैरामीटर की आपूर्ति प्रक्रिया जो पैरामीटर नहीं लेती है)। [संदर्भ]: http://www.sommarskog.se/error-handling-I.html#scope-abortion

मैं क्या जानना चाहूंगा कि क्या कोई निश्चित सूची है कि कौन सी त्रुटियां बैच निरस्त कर रही हैं और कौन से कथन समाप्त हो रहे हैं।

जवाबों:


6

मेरा मानना ​​है कि कुछ अपवाद हैं, लेकिन डेटाबेस इंजन त्रुटि से सुरक्षा (MSDN) :

19 या उच्चतर स्तर की गंभीरता वाले संदेश वर्तमान बैच के निष्पादन को रोकते हैं।

डेटाबेस कनेक्शन को समाप्त करने वाली त्रुटियां, आमतौर पर 20 से 25 के बीच की गंभीरता के साथ, CATCH ब्लॉक द्वारा नियंत्रित नहीं की जाती हैं क्योंकि कनेक्शन समाप्त होने पर निष्पादन रोक दिया जाता है।

तो ऐसा लगता है कि आप निम्नलिखित क्वेरी से एक निश्चित सूची प्राप्त कर सकते हैं (निश्चित रूप से यह आपको फ़िल्टर करने की अनुमति नहीं देगा कि उपयोगकर्ता टी-एसक्यूएल के कारण कौन से हो सकते हैं):

SELECT message_id, severity, [text]
FROM sys.messages
WHERE language_id = 1033 
AND severity >= 19
ORDER BY severity, message_id;

SQL Server 2012 में, यह 210 पंक्तियों का उत्पादन करता है।

SQL सर्वर 2016 में, यह 256 पंक्तियों का उत्पादन करता है।

वैसे, मैं नहीं मानता कि आपके प्रश्न में वर्णित दो परिदृश्य आपके सोचने के तरीके पर काम करते हैं, कम से कम SQL सर्वर के आधुनिक संस्करणों में नहीं। मैंने 2012 और 2016 दोनों पर यह कोशिश की (मेरा मानना ​​है कि एरलैंड का लेख SQL Server 2000 व्यवहार का वर्णन करता है, जो मुझे याद नहीं है कि यह कोई अलग था, लेकिन आज भी बहुत प्रासंगिक नहीं है, भले ही ऐसा हो)।

USE tempdb;
GO

CREATE PROCEDURE dbo.pA -- no parameters
AS PRINT 1
GO
CREATE PROCEDURE dbo.pB -- two parameters
@x INT, @y INT
AS PRINT 1
GO

SET XACT_ABORT OFF;
GO

EXEC dbo.pA @foo = 1; 
PRINT '### Calling procedure that doesn''t take parameters with a parameter';
GO

EXEC dbo.pB; 
PRINT '### Calling procedure that takes 2 parameters with no parameters';
GO

EXEC dbo.pB @x = 1; 
PRINT '### Calling procedure that takes 2 parameters with not enough parameters';
GO

EXEC dbo.pB @x = 1, @y = 2, @z = 3; 
PRINT '### Calling procedure that takes 2 parameters with too many parameters';
GO

ये सभी गंभीरता स्तर 16 की त्रुटियां पैदा करते हैं, और ये सभी प्रिंट आउटपुट के अनुसार, बैच के साथ आगे बढ़ते हैं:

Msg 8146, स्तर 16, राज्य 2, प्रक्रिया पीए, लाइन 11
प्रक्रिया पीए में कोई पैरामीटर नहीं है और तर्कों की आपूर्ति की गई थी।
### कॉलिंग प्रक्रिया जो एक पैरामीटर के साथ पैरामीटर नहीं लेती है
Msg 201, Level 16, State 4, Procedure pB, Line 14
प्रक्रिया या फ़ंक्शन 'pB' पैरामीटर '@x' की अपेक्षा करता है, जिसकी आपूर्ति नहीं की गई थी।
### कॉलिंग प्रक्रिया जिसमें कोई पैरामीटर नहीं है के साथ 2 पैरामीटर लेता है
Msg 201, Level 16, State 4, Procedure pB, Line 18
प्रक्रिया या फ़ंक्शन 'pB' पैरामीटर '@y' की अपेक्षा करता है, जिसकी आपूर्ति नहीं की गई थी।
### कॉलिंग प्रक्रिया जो 2 मापदंडों को पर्याप्त पैरामीटर नहीं लेती है
Msg 8144, स्तर 16, राज्य 2, प्रक्रिया पीबी, लाइन 22
प्रक्रिया या फ़ंक्शन पीबी में बहुत सारे तर्क निर्दिष्ट हैं।
### कॉलिंग प्रक्रिया जो कई मापदंडों के साथ 2 पैरामीटर लेती है

जैसा कि मुझे संदेह था, अपवाद हैं, निश्चित रूप से, टिप्पणियों में नोट किया गया है। रूपांतरण विफलता की गंभीरता 16 है लेकिन यह बैच को समाप्त कर देती है:

SET XACT_ABORT OFF;
SELECT CONVERT (INT, 'foo');
PRINT 'Made it.'; -- no print happens

परिणाम में इस बार प्रिंट आउटपुट शामिल नहीं है:

Msg 245, स्तर 16, राज्य 1
रूपांतरण डेटा प्रकार int के लिए varchar मान 'foo' परिवर्तित करते समय विफल रहा।


आपका बहुत बहुत धन्यवाद! मुझे लगा कि मैं पूर्व असंगतता के कारण एक संकेतक के रूप में गंभीरता स्तर का उपयोग करने में सक्षम नहीं होगा। यह सुनकर बहुत खुशी हुई कि ऐसा नहीं है।
जेमी अल्फोर्ड

Aargh! अभी भी कुछ गंभीरता स्तर 16 त्रुटियां हैं जो बैच को निरस्त कर देंगी। यदि मैं चयन करता हूं और क्रियान्वित करता हूं: ट्रांस प्रिंट शुरू करें @@ TRANCOUNT प्रिंट कन्वर्ट (int, 'abc') इसके बाद: प्रिंट @@ TRANCOUNT एक स्तर 16 त्रुटि होगी लेकिन बैच निरस्त हो जाएगा।
जेमी अल्फोर्ड

BTW, यदि आप ऐसे मामलों की खोज करते हैं, जहां अपवाद घोषित एक से अलग गंभीरता के साथ उठाया जाता है, तो कृपया उन्हें कनेक्ट के माध्यम से रिपोर्ट करें
रेमस रुसानु

2

@Aaron (अर्थात गंभीरता> = 19 और रूपांतरण विफलताओं) द्वारा उल्लिखित त्रुटियों के प्रकारों के अलावा , निम्न प्रकार की त्रुटियाँ, TRY के लिए MSDN पृष्ठ में नोट की गई ... CATCH , एक बैच को भी रद्द कर देगी:

निम्नलिखित प्रकार की त्रुटियों को एक CATCH ब्लॉक द्वारा नियंत्रित नहीं किया जाता है जब वे TRY के रूप में निष्पादन के समान स्तर पर होते हैं ... CATCH परिणाम इस प्रकार हैं:

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

  • कथन-स्तर पुनर्संयोजन के दौरान होने वाली त्रुटियां, जैसे ऑब्जेक्ट नाम रिज़ॉल्यूशन त्रुटियां, जो आस्थगित नाम रिज़ॉल्यूशन के कारण संकलन के बाद होती हैं।

इन त्रुटियों को उस स्तर पर लौटाया जाता है जो बैच, संग्रहीत कार्यविधि, या ट्रिगर को चलाता है।

नीचे दिए गए उदाहरणों में, कृपया ध्यान दें कि उनमें से तीन भी गंभीरता स्तर 15 हैं।

उदाहरण 1

SET XACT_ABORT OFF;
SELECT @NotDeclared; -- parse error
PRINT 'Do you see me?';

यह दिखाता है:

Msg 137, स्तर 15, राज्य 2, पंक्ति 2
को स्केलर चर "@NotDeclared" घोषित करना चाहिए।

उदाहरण २

SET XACT_ABORT OFF;
InvalidSQL; -- parse error
PRINT 'Do you see me?';

यह दिखाता है:

Msg 102, स्तर 15, राज्य 1, लाइन 2
'InvalidSQL' के पास गलत सिंटैक्स।

उदाहरण ३

SET XACT_ABORT OFF;
SELECT 1 -- statement preceding THROW not terminated by semicolon
THROW 50505, N'Error, yo', 1; -- parse error
PRINT 'Do you see me?';

यह दिखाता है:

एमएसजी 102, स्तर 15, राज्य 1, लाइन 3
'50505' के पास गलत सिंटैक्स।

उदाहरण ४

SET XACT_ABORT OFF;
SELECT NoSuchColumn FROM sys.objects; -- compilation error
PRINT 'Do you see me?';

यह दिखाता है:

Msg 207, स्तर 16, राज्य 1, पंक्ति 3
अमान्य स्तंभ नाम 'NoSuchColumn'।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.