मार्टिन के किसी भी जवाब से ध्यान हटाने के बजाय, मैं अपने बाकी के निष्कर्षों को POWER()
यहां जोड़ दूंगा ।
अपने घुटनों पर पकड़ो।
प्रस्तावना
सबसे पहले, मैं आपके लिए A, MSDN प्रलेखनPOWER()
प्रदर्शित करता हूं :
वाक्य - विन्यास
POWER ( float_expression , y )
तर्क
float_expression
एक प्रकार की फ्लोट की अभिव्यक्ति है या एक प्रकार की जिसे अस्थायी रूप से फ्लोट में परिवर्तित किया जा सकता है।
वापसी के प्रकार
के रूप में ही float_expression
।
आप उस अंतिम पंक्ति को पढ़ने से निष्कर्ष निकाल सकते हैं जो कि POWER()
रिटर्न प्रकार है FLOAT
, लेकिन फिर से पढ़ें। float_expression
"टाइप फ़्लोट का या एक प्रकार का जिसे फ़्लोट में रूपांतरित किया जा सकता है"। इसलिए, इसके नाम के बावजूद, float_expression
वास्तव में ए FLOAT
, ए DECIMAL
, या ए हो सकता है INT
। चूंकि इनका आउटपुट POWER()
समान है float_expression
, इसलिए यह भी उन प्रकारों में से एक हो सकता है।
इसलिए हमारे पास वापसी प्रकार के साथ एक स्केलर फ़ंक्शन है जो इनपुट पर निर्भर करता है। यह हो सकता है?
टिप्पणियों
मैं आपके सामने B को प्रदर्शित करता हूं, जो यह प्रदर्शित POWER()
करता है कि इसके इनपुट के आधार पर इसके आउटपुट को विभिन्न डेटा प्रकारों में डाला जाता है ।
SELECT
POWER(10, 3) AS int
, POWER(1000000000000, 3) AS numeric0 -- one trillion
, POWER(10.0, 3) AS numeric1
, POWER(10.12305, 3) AS numeric5
, POWER(1e1, 3) AS float
INTO power_test;
EXECUTE sp_help power_test;
DROP TABLE power_test;
प्रासंगिक परिणाम हैं:
Column_name Type Length Prec Scale
-------------------------------------------------
int int 4 10 0
numeric0 numeric 17 38 0
numeric1 numeric 17 38 1
numeric5 numeric 17 38 5
float float 8 53 NULL
जो प्रतीत हो रहा है, वह यह है कि इसमें शामिल होने वाले सबसे छोटे प्रकार में POWER()
डाली float_expression
जाती है, जिसमें शामिल नहीं है BIGINT
।
इसलिए, SELECT POWER(10.0, 38);
एक अतिप्रवाह त्रुटि के साथ विफल 10.0
हो जाता है क्योंकि NUMERIC(38, 1)
10 38 के परिणाम को धारण करने के लिए पर्याप्त नहीं होने के लिए डाली जाती है । ऐसा इसलिए है क्योंकि 10 38 दशमलव से पहले 39 अंक लेने के लिए फैलता है, जबकि NUMERIC(38, 1)
37 अंकों को दशमलव से पहले जमा कर सकता है। इसलिए, अधिकतम मूल्य NUMERIC(38, 1)
10 37 - 0.1 हो सकता है।
इस समझ के साथ सशस्त्र मैं एक और अतिप्रवाह विफलता को निम्न प्रकार से नियंत्रित कर सकता हूं।
SELECT POWER(1000000000, 3); -- one billion
एक अरब (पहले उदाहरण से एक ट्रिलियन के विपरीत, जो डाली जाती है NUMERIC(38, 0)
) सिर्फ एक में फिट होने के लिए काफी छोटा है INT
। तीसरी शक्ति के लिए उठाया गया एक अरब, हालांकि, INT
अतिप्रवाह त्रुटि के लिए बहुत बड़ा है ।
कई अन्य कार्य समान व्यवहार प्रदर्शित करते हैं, जहां उनका आउटपुट प्रकार उनके इनपुट पर निर्भर होता है:
- गणितीय कार्य :
POWER()
, CEILING()
, FLOOR()
, RADIANS()
, DEGREES()
, औरABS()
- सिस्टम कार्यों और भाव :
NULLIF()
, ISNULL()
, COALESCE()
, IIF()
, CHOOSE()
, और CASE
भाव
- अंकगणितीय ऑपरेटर : दोनों
SELECT 2 * @MAX_INT;
और SELECT @MAX_SMALLINT + @MAX_SMALLINT;
, उदाहरण के लिए, अंकगणित के परिणाम में परिवर्तन होता है जब चर नामित डेटा प्रकार के होते हैं।
निष्कर्ष
इस विशेष मामले में, समाधान का उपयोग करना है SELECT POWER(1e1, precision)...
। यह उन सभी संभावित पूर्वावस्थाओं के लिए काम करेगा , जो 1e1
डाली जाती हैं FLOAT
, जो बड़ी संख्या में हास्यास्पद हो सकती हैं ।
चूंकि ये कार्य इतने सामान्य हैं, यह समझना महत्वपूर्ण है कि आपके परिणाम गोल हो सकते हैं या उनके व्यवहार के कारण अतिप्रवाह त्रुटियों का कारण हो सकता है। यदि आप अपने आउटपुट के लिए किसी विशिष्ट डेटा प्रकार की अपेक्षा या भरोसा करते हैं, तो आवश्यक रूप से संबंधित इनपुट को स्पष्ट रूप से डालें।
तो बच्चों, अब जब आप यह जानते हैं, तो आप आगे बढ़ सकते हैं और समृद्ध हो सकते हैं।