2012-10-31 15 views
6

नीचे तालिका संरचना और डेटा के प्रकार का सबसेट है जिसके साथ मैं काम कर रहा हूं।अंकगणित अतिप्रवाह त्रुटि वर्चर को डेटा प्रकार संख्यात्मक में परिवर्तित कर रही है। '10' <= 9.00

CREATE TABLE #Test 
(
    Val varchar(5) 
    ,Type varchar(5) 
) 

INSERT #Test VALUES ('Yes','Text') 
INSERT #Test VALUES ('10','Int') 
INSERT #Test VALUES ('10.00','Float') 
INSERT #Test VALUES ('9.00','Float') 
INSERT #Test VALUES ('9','Int') 

मैं (संख्यात्मक डेटा प्रकार का होना चाहिए) एक प्रश्न मुझे बताएं कि स्तंभ 'वैल' < है दूँगी कि = 9.00 लिखना चाहते हैं। मैंने निम्न कार्य करके ऐसा किया:

SELECT * 
FROM 
    (
     SELECT Val 
     FROM #Test 
     WHERE Type = 'Int' 
    ) IntsOnly 
WHERE IntsOnly.Val <= 9.00 

यह मुझे अंकगणित अतिप्रवाह त्रुटि देता है। हालांकि, अगर मैं मूल्य '10' के साथ डेटा की पंक्ति को बाहर करता हूं:

SELECT * 
FROM 
    (
     SELECT Val 
     FROM #Test 
     WHERE Type = 'Int' 
     AND Val <> '10' 
    ) IntsOnly 
WHERE IntsOnly.Val <= 9.00 

यह किसी भी मुद्दे के बिना काम करता है। मेरा प्रश्न यह नहीं है कि इसे कैसे ठीक किया जाए, क्योंकि मुझे पता है कि मैं डेटा को केवल प्रारूप में परिवर्तित कर सकता हूं।

मेरा प्रश्न यह है कि कॉलम 'वैल' में '10' का मान एक त्रुटि लौटा रहा है। निश्चित रूप से तर्क को 'गलत' वापस करना चाहिए और केवल पंक्तियों को बाहर करना चाहिए क्योंकि '10' (जो मुझे लगता है कि पूर्ण रूप से परिवर्तित किया गया है) 9.00 से अधिक है।

धन्यवाद।

+1

अंकगणित अतिप्रवाह त्रुटि कर रही है, क्या आप वाकई है? एक [रूपांतरण त्रुटि] नहीं है (http://stackoverflow.com/q/9136722/11683)? – GSerg

+0

रूपांतरण में *** स्पष्ट *** होने का प्रयास करें। 'सीएएसटी (वैल एएस डिसीमल (9,2)) <= सीएएसटी (9.00 एएस डिसीमल (9,2)) 'क्या देता है? – MatBailie

+0

जीएसर्ग - हाँ, अंकगणित अतिप्रवाह वर्चर को संख्यात्मक रूपांतरित कर रहा है। डैम्स - यह चाल करता है! हालांकि, मैं समझना चाहता हूं कि अंतर्निहित रूपांतरण क्यों काम नहीं करता है? मेरा विचार था कि यह उस रूपांतरण को कर सकता है और किसी मुद्दे का कारण नहीं बनना चाहिए? – JBond

उत्तर

9

इसका कारण यह है कि यह परोक्ष एक NUMERIC (3,2) है, जो स्वाभाविक रूप से 10

यह NUMERIC उपयोग कर रहा है की तरह एक 2 अंकों मूल्य पर अतिप्रवाह होगा (3 को Val स्तंभ कास्ट करने के लिए कोशिश कर रहा है एक अंकगणित ओवरफ़्लो उत्पन्न करता है , 2) लक्ष्य प्रकार और आकार के रूप में क्योंकि यह सबसे छोटा संख्या है कि 9.00 फिट होना प्रतीत होता है।

समाधान, ज़ाहिर है, explict कास्टिंग का उपयोग करने के बजाय इसे परोक्ष

+0

मैंने जो भी देखा है वह यह है कि मान लें कि आपके पास 'दशमलव (5,3)' है और आपके पास संख्या 12.321' है जिसे स्वीकार किया जाएगा। लेकिन अगर आपका नंबर '123.321' है <- यह कुल मिलाकर' 6 अंक है 'तो इसे स्वीकार न करें। आपका दशमलव तब 'दशमलव (6,3)' होना चाहिए। यही वह है जो मैंने परीक्षण किया है और खुद को पुष्टि की है 'एसक्यूएल 2014' – Pierre

+2

@ पियरे हां, यह सचमुच सिर्फ' डेसिमल 'डेटाटाइप विनिर्देश की परिभाषा है। – RBarryYoung

4

BOL से:

Transact SQL कथन में, एक दशमलव बिंदु के साथ एक निरंतर स्वचालित रूप से एक संख्यात्मक डेटा मूल्य में बदल जाता है, कम से कम परिशुद्धता और बड़े पैमाने आवश्यक का उपयोग कर। उदाहरण के लिए, निरंतर 12.345 5 का एक सटीक और 3.

के पैमाने इसका मतलब है कि अपने लगातार 9.00 1 के एक सटीक और 0 की शुद्धता के पैमाने होगा साथ एक अंकीय मान में बदल जाता है 3 और 2 का एक पैमाने, इसलिए यह मान 10 को संग्रहीत नहीं कर सकता है, जिसके लिए 2 + scale की न्यूनतम परिशुद्धता की आवश्यकता होती है।

आपको सही परिशुद्धता और स्केल निर्दिष्ट करने के लिए CAST या CONVERT के साथ IntsOnly.Val को लपेटने की आवश्यकता होगी।

+0

मुझे यकीन है कि आप 2 के पैमाने लिखना चाहते हैं? –

+0

यह निर्भर करता है कि SQL इंजन कितना चालाक है; यह या तो 'न्यूमेरिक (3, 2)' में परिवर्तित हो सकता है क्योंकि दशमलव बिंदु के बाद दो अंक हैं, या यह 'संख्यात्मक (1, 0)' में परिवर्तित हो सकता है क्योंकि दशमलव बिंदु के बाद अंक '0' । –

+0

यह दशमलव बिंदु के दाईं ओर सभी शून्यों को देखता है लेकिन बाईं ओर सभी प्रमुख शून्यों को अनदेखा करता है। तो '00000.0000'' न्यूमेरिक (4,4) ' –

संबंधित मुद्दे

 संबंधित मुद्दे