मुझे पता है कि यह काफी एक पुराने सवाल है, लेकिन मौजूदा जवाब में से कोई भी पता करने के लिए लग रहे हैं "क्यों?" आपके प्रश्न के पहलू।
सबसे पहले, आपके शाब्दिक अभिव्यक्तियों के लिए डेटा प्रकार क्या है? मुझे यकीन है कि नहीं था (और यह देखने के लिए ऊपर नहीं था) तो मैं निम्नलिखित भाग गया:
select 1.4 union all
select 'frob'
जो त्रुटि देता है:
Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.
ठीक है, तो 1.4
और अन्य शाब्दिक numeric
कर रहे हैं - उर्फ decimal
।
इसके बाद, क्या SUM
समारोह की वापसी प्रकार, है पारित कर दिया है, तो एक decimal(p,s)
:
decimal(38, s)
ठीक है, तो आपकी क्वेरी में 3 SUM
भाव का डेटा प्रकार के होते हैं decimal(38,1)
, decimal(38,4)
और decimal(38,2)
।differing precisions and scales के नियमों के आधार पर, decimal(38,1)
से चुनने के लिए उपलब्ध उन 3 डेटा प्रकारों को अंतिम चुना गया प्रकार दिया गया है।
The result precision and scale have an absolute maximum of 38. When a result precision is greater than 38, the corresponding scale is reduced to prevent the integral part of a result from being truncated.
तो, अंत में, पीठ decimal
पर दस्तावेजीकरण करने के लिए:
By default, SQL Server uses rounding when converting a number to a decimal or numeric value with a lower precision and scale. However, if the SET ARITHABORT option is ON, SQL Server raises an error when overflow occurs. Loss of only precision and scale is not sufficient to raise an error.
ताकि अपने अंतिम परिणाम है।
पहले इस प्रकार पर आश्चर्यजनक लग सकते हैं, जब तक आप महसूस करते हैं कि आम तौर पर, sum
कई पंक्तियों के खिलाफ काम करेगा और यह आसानी से अपने स्वयं के डेटा प्रकार से ऊपर जाने का एक दिया परिशुद्धता और बड़े पैमाने की एक से अधिक मान के लिए संभव है। decimal(38,s)
किसी भी परिशुद्धता को खोए बिना किसी भी अतिप्रवाह को समायोजित करने के लिए सबसे बड़ा संभव स्थान देता है, विशेषSUM()
घटना के लिए, और इसका मतलब है कि क्वेरी के निष्पादित होने से पहले अंतिम डेटा प्रकार का निर्णय लिया जा सकता है।