त्रुटि संदेश 8134 से निपटने के लिए यहां पांच विकल्प दिए गए हैं "शून्य त्रुटि से विभाजित करें" SQL सर्वर में।
त्रुटि
सबसे पहले, यहां कोड का एक उदाहरण दिया गया है जो उस त्रुटि को उत्पन्न करता है जिसके बारे में हम बात कर रहे हैं:
SELECT 1 / 0;
परिणाम:
Msg 8134, Level 16, State 1, Line 1 Divide by zero error encountered.
हमें त्रुटि मिलती है क्योंकि हम किसी संख्या को शून्य से विभाजित करने का प्रयास कर रहे हैं। गणितीय रूप से, इसका कोई मतलब नहीं है। आप किसी संख्या को शून्य से विभाजित करके सार्थक परिणाम की आशा नहीं कर सकते।
इस त्रुटि से निपटने के लिए, हमें यह तय करने की आवश्यकता है कि जब हम शून्य से विभाजित करने का प्रयास करते हैं तो क्या लौटाया जाना चाहिए। उदाहरण के लिए, हम चाहते हैं कि एक शून्य मान लौटाया जाए। या हम चाहते हैं कि शून्य वापस आ जाए। या कुछ और मूल्य।
इस त्रुटि से निपटने के लिए नीचे कुछ विकल्प दिए गए हैं।
विकल्प 1:NULLIF()
अभिव्यक्ति
इस त्रुटि से निपटने का एक त्वरित और आसान तरीका NULLIF()
. का उपयोग करना है अभिव्यक्ति:
SELECT 1 / NULLIF( 0, 0 );
परिणाम:
NULL
NULLIF()
रिटर्न NULL
यदि दो निर्दिष्ट भाव समान मान हैं। यदि दो भाव भिन्न हैं तो यह पहली अभिव्यक्ति देता है। इसलिए, यदि हम दूसरी अभिव्यक्ति के रूप में शून्य का उपयोग करते हैं, तो जब भी पहली अभिव्यक्ति शून्य होगी, तो हमें एक शून्य मान मिलेगा। किसी संख्या को NULL
. से विभाजित करना NULL
में परिणाम ।
दरअसल, SQL सर्वर पहले से ही NULL
लौटाता है विभाजन-दर-शून्य त्रुटि पर, लेकिन हमारे ARITHABORT
के कारण अधिकांश मामलों में हमें यह दिखाई नहीं देता है और ANSI_WARNINGS
सेटिंग्स (इस पर बाद में)।
विकल्प 2:ISNULL()
जोड़ें समारोह
कुछ मामलों में, आप NULL
. के अलावा कोई अन्य मान वापस करना पसंद कर सकते हैं ।
ऐसे मामलों में, आप पिछले उदाहरण को ISNULL()
. पर पास कर सकते हैं समारोह:
SELECT ISNULL(1 / NULLIF( 0, 0 ), 0);
परिणाम:
0
यहां मैंने निर्दिष्ट किया है कि जब भी परिणाम NULL
हो तो शून्य लौटाया जाना चाहिए ।
हालांकि सावधान रहें। कुछ मामलों में, शून्य लौटाना अनुचित हो सकता है। उदाहरण के लिए, यदि आप इन्वेंट्री आपूर्ति के साथ काम कर रहे हैं, तो शून्य निर्दिष्ट करने का अर्थ यह हो सकता है कि शून्य उत्पाद हैं, जो शायद ऐसा न हो।
विकल्प 3:एक CASE
का उपयोग करें कथन
इसे करने का दूसरा तरीका CASE
. का उपयोग करना है कथन:
DECLARE @n1 INT = 20;
DECLARE @n2 INT = 0;
SELECT CASE
WHEN @n2 = 0
THEN NULL
ELSE @n1 / @n2
END
परिणाम:
NULL
विकल्प 4:SET ARITHABORT
कथन
SET ARITHABORT
कथन एक क्वेरी समाप्त करता है जब क्वेरी निष्पादन के दौरान एक अतिप्रवाह या विभाजन-दर-शून्य त्रुटि होती है। हम इसे SET ANSI WARNINGS
. के संयोजन में उपयोग कर सकते हैं NULL
लौटाने के लिए जब भी शून्य से भाग दें त्रुटि हो सकती है:
SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;
SELECT 20 / 0;
परिणाम:
NULL
Microsoft अनुशंसा करता है कि आप हमेशा ARITHABORT
. सेट करें करने के लिए ON
आपके लॉगऑन सत्रों में, और जो इसे OFF
पर सेट कर रहा है क्वेरी ऑप्टिमाइज़ेशन को नकारात्मक रूप से प्रभावित कर सकता है, जिससे प्रदर्शन संबंधी समस्याएं हो सकती हैं।
कुछ क्लाइंट (जैसे SQL सर्वर प्रबंधन स्टूडियो) ARITHABORT
सेट करें करने के लिए ON
डिफ़ॉल्ट रूप से। यही कारण है कि आपको शायद NULL
. दिखाई नहीं दे रहा है जब आप शून्य से विभाजित करते हैं तो मूल्य वापस किया जा रहा है। आप SET ARITHIGNORE
. का उपयोग कर सकते हैं यदि आप चाहें तो इस व्यवहार को बदलने के लिए।
विकल्प 5:SET ARITHIGNORE
कथन
SET ARITHIGNORE
कथन नियंत्रित करता है कि क्या त्रुटि संदेश किसी क्वेरी के दौरान अतिप्रवाह या शून्य से विभाजित त्रुटियों से लौटाए जाते हैं:
SET ARITHABORT OFF;
SET ANSI_WARNINGS OFF;
SET ARITHIGNORE ON;
SELECT 1 / 0 AS Result_1;
SET ARITHIGNORE OFF;
SELECT 1 / 0 AS Result_2;
परिणाम:
Commands completed successfully. Commands completed successfully. Commands completed successfully. +------------+ | Result_1 | |------------| | NULL | +------------+ (1 row affected) Commands completed successfully. +------------+ | Result_2 | |------------| | NULL | +------------+ Division by zero occurred.
यहाँ, मैंने ARITHABORT
set सेट किया है और ANSI_WARNINGS
करने के लिए OFF
ताकि त्रुटि के कारण कथन निरस्त न हो, और NULL
जब भी कोई विभाजन-दर-शून्य त्रुटि होती है, तो उसे वापस कर दिया जाता है।
ध्यान दें कि SET ARITHIGNORE
सेटिंग केवल यह नियंत्रित करती है कि कोई त्रुटि संदेश लौटाया गया है या नहीं। SQL सर्वर एक NULL
लौटाता है इस सेटिंग पर ध्यान दिए बिना, अतिप्रवाह या शून्य से विभाजित त्रुटि वाली गणना में।
उपरोक्त उदाहरण में हम देख सकते हैं कि जब ARITHIGNORE
ON
है , शून्य त्रुटि से विभाजन वापस नहीं किया जाता है। जब यह OFF
हो , शून्य त्रुटि संदेश द्वारा विभाजन लौटा दिया जाता है।