अंकगणितीय अतिप्रवाह त्रुटि संख्यात्मक को डेटा प्रकार संख्यात्मक में परिवर्तित करना


88

मैं यह त्रुटि संदेश प्राप्त करता रहता हूं जब भी मैं इस प्रश्न को चलाता हूं:

Msg 8115, Level 16, State 8, Line 33
Arithmetic overflow error converting numeric to data type numeric.
The statement has been terminated.

लेकिन यदि मैं (7,0) तालिका बनाता हूं, तो मुझे त्रुटि संदेश नहीं मिलता है। लेकिन मुझे अपने डेटा को एक दशमलव के रूप में प्रदर्शित करने की आवश्यकता है। मैंने कोशिश की है 8,3 काम नहीं करता है।

क्या कोई ऐसा है जो मुझे इस काम में मदद कर सकता है? किसी भी मदद की बहुत सराहना की जाएगी।

DECLARE @StartDate AS DATETIME
DECLARE @StartDate_y AS DATETIME
DECLARE @EndDate AS DATETIME
DECLARE @temp_y AS DATETIME

SET @temp_y = Dateadd(yy, Datediff(yy, 0, Getdate()), 0)
SET @StartDate_y = Dateadd(dd, 1 - Datepart(dw, Dateadd("ww", -2, @temp_y)),
                                      Dateadd("ww", -2, @temp_y))
SET @StartDate = Dateadd(dd, 1 - Datepart(dw, Dateadd("ww", -2, Getdate())),
                                  Dateadd("ww", -2, Getdate()))
SET @EndDate = Dateadd(dd, 6, @StartDate)

--temp table to hold all cities in list
CREATE TABLE ##temp
  (
     city VARCHAR(50)
  )

INSERT INTO ##temp
VALUES     ('ABERDEEN'),
            ('CHESAPEAKE'),
            ('Preffered-Seafood/CHICAGO'),
            ('Preffered-Redist/CHICAGO'),
            ('CLACKAMAS'),
            ('COLUMBUS'),
            ('CONKLIN'),
            ('DENVER'),
            ('FORT WORTH'),
            ('HANOVER PARK'),
            ('JACKSONVILLE'),
            ('LAKELAND'),
            ('MONTGOMERY'),
            ('PFW-NORTHEAST'),
            ('PFW-SOUTHEAST'),
            ('RIVERSIDE'),
            ('TRENTON,CANADA'),
            ('VERNON')

--temp to hold data for the cities
CREATE TABLE #temp
  (
     city            VARCHAR(50),
     ytdshipments    INT,
     ytdtotalweight  DECIMAL(7, 2) NOT NULL,
     ytdtotalcharges DECIMAL (7, 2) NOT NULL
  --YTDRevperPound decimal (7,2) not null
  )

INSERT INTO #temp
SELECT ##temp.city,
       0,
       0,
       0
FROM   ##temp

INSERT #temp
-- YTD shipments/Charges/Weight by city
SELECT city = CASE
                WHEN nameaddrmstr_1.city IN( 'ABERDEEN', 'CHESAPEAKE', 'CHICAGO'
                                             ,
                                             'CLACKAMAS',
                                             'COLUMBUS', 'CONKLIN', 'DENVER',
                                             'FORT WORTH',
                                             'HANOVER PARK', 'JACKSONVILLE',
                                             'LAKELAND'
                                             ,
                                             'MONTGOMERY'
                                                    ,
                                             'RIVERSIDE', 'TRENTON', 'VERNON' )
              THEN
                CASE
                  WHEN
              nameaddrmstr_1.city = 'CHICAGO'
              AND h.shipr = 'PREFRESVS' THEN 'Preffered-Redist/CHICAGO'
                WHEN
              nameaddrmstr_1.city = 'TRENTON'
              AND nameaddrmstr_1.city = 'CA' THEN 'TRENTON,CANADA'
                ELSE
              nameaddrmstr_1.city
                END
                ELSE 'Other'
              END,
       ytdshipments = COUNT(CONVERT(VARCHAR(10), h.dateshipped, 101)),
       ytdtotalweight =SUM(CASE
                             WHEN h.totaldimwgt > h.totalwgt THEN h.totaldimwgt
                             ELSE h.totalwgt
                           END),
       ytdtotalcharges = SUM (cs.totalestrevcharges)
--YTDRevperPound = convert(decimal(7,2),sum (cs.TotalEstRevCharges )/sum( CASE WHEN h.TotalDimWGT > > h.TotalWGT THEN h.TotalDimWGT ELSE h.TotalWGT END ))
FROM   as400.dbo.hawb AS h WITH(nolock)
       INNER JOIN as400.dbo.chargesummary AS cs
         ON h.hawbnum = cs.hawbnum
       LEFT OUTER JOIN as400.dbo.nameaddrmstr AS nameaddrmstr_1
         ON h.shipr = nameaddrmstr_1.nameaddrcode
WHERE  h.dateshipped >= '01/01/2010'
       AND h.dateshipped <= '12/19/2010'
       --WHERE H.DateShipped >= >= @StartDate_y AND H.dateshipped <= @EndDate 
       AND h.cust IN( 'DARDENREED', 'MAINEDARDE', 'MBMRIVRSDE', 'MBMCOLUMBS',
                      'MBMLAKELND', 'MBMFTWORTH', 'SYGMACOLUM', 'SYGMANETW6',
                      'MAI215', 'MBMMNTGMRY' )
GROUP  BY CASE
  WHEN nameaddrmstr_1.city IN( 'ABERDEEN', 'CHESAPEAKE', 'CHICAGO', 'CLACKAMAS',
                               'COLUMBUS', 'CONKLIN', 'DENVER', 'FORT WORTH',
                               'HANOVER PARK', 'JACKSONVILLE', 'LAKELAND',
                               'MONTGOMERY'
                                      ,
                               'RIVERSIDE', 'TRENTON', 'VERNON' ) THEN CASE
                                                                         WHEN
nameaddrmstr_1.city = 'CHICAGO'
AND h.shipr = 'PREFRESVS' THEN 'Preffered-Redist/CHICAGO'
                                                                         WHEN
nameaddrmstr_1.city = 'TRENTON'
AND nameaddrmstr_1.city = 'CA' THEN 'TRENTON,CANADA'
                                                                         ELSE
nameaddrmstr_1.city
                                                                       END
  ELSE 'Other'
END

SELECT #temp.city                 AS city,
       MAX(#temp.ytdshipments)    AS ytdshipments,
       MAX(#temp.ytdtotalweight)  AS ytdtotalweight,
       MAX(#temp.ytdtotalcharges) AS ytdtotalcharges
FROM   #temp WITH(nolock)
       LEFT OUTER JOIN ##temp
         ON ##temp.city = #temp.city
GROUP  BY #temp.city

DROP TABLE #temp

DROP TABLE ##temp  

9
मैं भी साफ़ कर रही है कि शुरू करने नहीं जा रहा हूँ
m.edmondson

3
मैंने आपके एसक्यूएल को ऑनलाइन फॉर्मेटर के माध्यम से यहां पहुंचाया है। dpriver.com/pp/sqlformat.htm अभी भी एक मैनुअल सुथरा के साथ कर सकता है।
मार्टिन स्मिथ

3
फॉर्मेटर का विकल्प क्यों नहीं बनाया गया है?
एडॉल्फ लहसुन

6
Microsoft, यदि आप सुन रहे हैं, तो त्रुटि संदेश "Msg 8115, स्तर 16, राज्य 8, पंक्ति 1 अंकगणितीय अतिप्रवाह त्रुटि संख्यात्मक को डेटा प्रकार संख्यात्मक में परिवर्तित करना।" मूल मूल्य को इंगित करके सुधार किया जा सकता है जिसे परिवर्तित नहीं किया जा सकता है। जब 100bn पंक्तियों की तालिका लोड करने और यह समझने की कोशिश करने में बहुत मदद मिलेगी कि कौन सा मूल्य अपमानजनक था। एक SELECT का कॉलम नंबर जोड़ना फिर से उतना ही उपयोगी होगा। ईजी। सेलेक्ट CAST (12345678910 दशमलव के रूप में (12,0)), CAST (12345678910 दशमलव के रूप में (12,2)) ... स्ट्रिंग जोड़ें: "मान: 12345678910 कॉलम: 2" त्रुटि संदेश के लिए।
wwmbes

जवाबों:


206

मेरा अनुमान है कि आप अपने दशमलव क्षेत्रों में 99999.99 से अधिक संख्या को निचोड़ने का प्रयास कर रहे हैं। यदि इसे 99999.999 से अधिक है तो इसे (8,3) में बदलना कुछ भी नहीं है - आपको दशमलव से पहले अंकों की संख्या बढ़ाने की आवश्यकता है । आप इसे सटीक (दशमलव से पहले और बाद में अंकों की कुल संख्या) बढ़ाकर कर सकते हैं। आप पैमाने को उसी तरह छोड़ सकते हैं जब तक आपको बदलने की आवश्यकता नहीं है कि कितने दशमलव स्थानों को संग्रहीत करना है। कोशिश करो decimal(9,2)या decimal(10,2)जो भी हो।

आप इस पर टिप्पणी करके परीक्षण कर सकते हैं insert #tempऔर देख सकते हैं कि आपको कौन सा नंबर दे रहा है और यदि आपका कॉलम आपके हैंडल से बड़ा है तो देखें।


17
मैं स्वतः उत्पन्न खातों वाले लोगों के प्रश्नों का उत्तर देने से परेशान नहीं होता; उन्हें समझ में नहीं आता कि वे कहां हैं और वे ठीक नहीं होने के बाद वापस नहीं आते हैं। @ user572984: हेलो !? कोई घर पर है? <टैप स्क्रीन> नहींं, ऐसा नहीं लगता था।
ओला तुवेसन

मैंने दशमलव संख्या के डॉट को हटा लिया था, इसलिए यह बड़ा हो गया। धन्यवाद!
वेलिंगटन लॉरिंडो

उस विशिष्ट कॉलम की लंबाई के Database field lengthबराबर की जाँच करें DataTableAdapter- संग्रहीत कार्यविधि के विशिष्ट पैरामीटर की लंबाई
Elshan

1
@OlaTuvesson, सौभाग्य से, हालांकि User572984 एक लंबा है और संभावना है कि यह कभी नहीं देखेगा, क्योंकि आज (8 अक्टूबर, 2020) इसे 270K टाइम्स से अधिक देखा गया है ! इसलिए, इसे अज्ञात रूप से वापस भुगतान करने में, इसे 270K SO उपयोगकर्ताओं के रूप में लाभ हुआ है!
दान

82

मुझे लगता है कि मुझे एक बहुत महत्वपूर्ण बात स्पष्ट करने की आवश्यकता है, दूसरों के लिए (जैसे मेरे सहकर्मी) जो इस धागे के पार आए और गलत जानकारी मिली।

दिया गया उत्तर ("दशमलव (9,2) या दशमलव (10,2) या जो भी हो।)) सही है, लेकिन कारण (" दशमलव से पहले अंकों की संख्या में वृद्धि ") गलत है।

दशमलव (पी, एस) और संख्यात्मक (पी, एस) दोनों एक सटीक और एक स्केल निर्दिष्ट करते हैं । "सटीक" दशमलव के बाईं ओर अंकों की संख्या नहीं है, बल्कि इसके बजाय संख्या की कुल सटीकता है।

उदाहरण के लिए: दशमलव (2,1) 0.0 से 9.9 को कवर करता है, क्योंकि परिशुद्धता 2 अंक (00 से 99) है और पैमाना 1. दशमलव (4,1) में 000.0 से 999.9 दशमलव (4,2) कवर है 00.00 99.99 दशमलव (4,3) 0.000 से 9.999 तक है


7
सटीक बढ़ाकर और पैमाने को छोड़ते हुए, आप दशमलव से पहले अंकों की संख्या बढ़ा रहे हैं । इसलिए मैंने जो कहा वह गलत नहीं है, लेकिन मैं यह देखता हूं कि इसे गलत कैसे समझा जा सकता है। मैंने इसे इस तरह से कहा क्योंकि ओपी मूल रूप से केवल पैमाने को बढ़ाकर समस्या को ठीक करने की कोशिश कर रहा था, लेकिन आप सही हैं; यह कुल सटीकता है जिसे बढ़ाने की आवश्यकता है।
adam0101

1

यदि आप दशमलव से आकार (7,2) को दशमलव (9,2) से कम करना चाहते हैं, तो आपको मौजूदा डेटा के लिए मानों को दशमलव (7,2) में फिट करने के लिए अधिक होना चाहिए। या तो आपको उन नंबरों को हटाना होगा जो आपके नए आकार में फिट होने के लिए इसे छोटा कर रहे हैं। यदि आप जिस क्षेत्र को अपडेट करने का प्रयास कर रहे हैं, उसके लिए कोई डेटा नहीं था, तो यह समस्याओं के बिना स्वचालित रूप से करेगा


0

CAST फ़ंक्शन के ठीक उसी तरह TRY_CAST फ़ंक्शन का उपयोग करें। TRY_CAST एक स्ट्रिंग लेता है और इसे AS कीवर्ड के बाद निर्दिष्ट डेटा प्रकार में डालने का प्रयास करता है। यदि रूपांतरण विफल रहता है, तो TRY_CAST विफल होने के बजाय NULL लौटाता है।


1
TRY_CAST एक अभिव्यक्ति लेता है, जिसका मूल्य कास्ट है। जैसा कि आप इसे कहते हैं, वैसे ही नहीं।
टीटी।

यद्यपि यह रूटीन को त्रुटि के बिना पूरा करने की अनुमति देगा, यह लापता डेटा की कीमत पर होगा। त्रुटि का उद्देश्य यह इंगित करना है कि लापता डेटा को रोकने के लिए हस्तक्षेप की आवश्यकता है। आपका समाधान केवल तभी काम करेगा जब आप वास्तव में परवाह नहीं करेंगे कि परिणाम मौजूद है या नहीं।
डैन

-2

अपना मान जांचें जो आप पूर्णांक कॉलम में संग्रहीत करना चाहते हैं। मुझे लगता है कि यह अधिक है तो पूर्णांक की सीमा। यदि आप अधिक से अधिक मूल्य संचित करना चाहते हैं तो पूर्णांक सीमा। आपको Bigint डेटाटाइप का उपयोग करना चाहिए


ओपी इंगित करता है कि प्रश्न में स्तम्भ न्यूमेरिक है, न कि इंटेगर (जैसा कि त्रुटि संदेश द्वारा इंगित किया गया है "अंकगणितीय अतिप्रवाह त्रुटि संख्यात्मक को डेटा टाइप न्यूमेरिक में परिवर्तित करती है"), और शीर्ष पोस्ट किए गए उत्तर इसे सही तरीके से संबोधित करते हैं। आपका उत्तर सही ढंग से समस्या (परिणाम को संग्रहीत करने के लिए अपर्याप्त कमरे) की पहचान करता है, लेकिन प्रश्न के मूल इरादे को याद करता है।
दान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.