গাণিতিক ওভারফ্লো ত্রুটি সংখ্যার সাথে ডেটা টাইপের সংখ্যায় রূপান্তর করে


91

আমি এই ত্রুটি বার্তাটি প্রতিটি সময়ই চালিয়ে যাচ্ছি:

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

তবে আমি যদি তৈরি টেবিলটি (7,0) এ পরিবর্তন করি তবে আমি ত্রুটি বার্তাটি পাই না ut তবে আমার ডেটা দশমিক হিসাবে প্রদর্শিত হওয়া দরকার। আমি চেষ্টা করেছি 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  

11
আমি এমনকি এই
গোছানো

4
আমি এখানে অনলাইন ফর্ম্যাটারের মাধ্যমে আপনার এসকিউএলকে চাক করেছি। dpriver.com/pp/sqlformat.htm যদিও এখনও একটি ম্যানুয়াল পরিপাটি করতে পারেন।
মার্টিন স্মিথ

4
কেন একটি ফর্ম্যাটর বিকল্প অন্তর্নির্মিত হয় না?
অ্যাডল্ফ রসুন

12
মাইক্রোসফ্ট, যদি আপনি শুনছেন, ত্রুটি বার্তা "এমএসজি 8115, স্তর 16, রাজ্য 8, লাইন 1 গাণিতিক ওভারফ্লো ত্রুটি সংখ্যাকে ডেটা টাইপের সংখ্যায় রূপান্তর করে" " রূপান্তর করা যায়নি এমন আসল মানটি নির্দেশ করে উন্নত করা যেতে পারে। 100bn সারিগুলির একটি টেবিল লোড করার সময় এবং কোন মানটি আপত্তিজনক তা বোঝার চেষ্টা করলে এটি অনেক সাহায্য করবে। একটি নির্বাচনের কলাম নম্বর যুক্ত করা আবার তত কার্যকর হবে। ইজি। ক্যাসেট নির্বাচন করুন (12345678910 দশমিক হিসাবে (12,0)), CAST (12345678910 দশমিক হিসাবে (12,2)) ... স্ট্রিং যুক্ত করুন: "মান: 12345678910 কলাম: 2" ত্রুটি বার্তায়।
wwmbes

উত্তর:


208

আমার অনুমান যে আপনি আপনার দশমিক ক্ষেত্রগুলিতে 99999.99 এর চেয়ে বেশি সংখ্যক বার বার করার চেষ্টা করছেন। এটি (8,3) এ পরিবর্তন করা যদি এটি 99999.999 এর চেয়ে বেশি হয় তবে কিছুই করা যাচ্ছে না - দশমিকের আগে আপনাকে অঙ্কের সংখ্যা বাড়িয়ে তুলতে হবে । আপনি নির্ভুলতা বাড়িয়ে এটি করতে পারেন (যা দশমিকের আগে এবং পরে সংখ্যাগুলির মোট সংখ্যা)। আপনি কত দশমিক স্থান সংরক্ষণ করতে হবে তা পরিবর্তন না করে আপনি স্কেলটি একইরকম ছেড়ে দিতে পারেন। চেষ্টা করুন decimal(9,2)বা decimal(10,2)যাই হোক না কেন।

আপনি এটিকে মন্তব্য করে পরীক্ষা করতে পারেন insert #tempএবং নির্বাচিত বিবৃতি আপনাকে কী নম্বর দিচ্ছে তা দেখুন এবং তারা আপনার কলামটি হ্যান্ডল করতে পারে তার চেয়ে বড় কিনা তা দেখুন।


18
আমি স্বতঃ-উত্পন্ন অ্যাকাউন্টযুক্ত লোকদের প্রশ্নের জবাব দিতে বিরক্ত করব না; তারা কোথায় তা তারা বুঝতে পারে না এবং তাদের ঠিক করার পরে তারা ফিরে আসে না। @ ব্যবহারকারী 5772984: হেলো !? কেউ বাড়ি? <ট্যাপস স্ক্রিন> নাহ, এমনটি ভাবেন নি।
ওলা টুভসন

আমি দশমিক সংখ্যার বিন্দুটি বন্ধ করে দিয়েছিলাম তাই এটি আরও বড় হয়ে উঠেছে। ধন্যবাদ!
ওয়েলিংটন লরিন্ডো

নির্দিষ্ট কলামের দৈর্ঘ্যের Database field lengthসমান হিসাবে পরীক্ষা করুন DataTableAdapter- সঞ্চিত পদ্ধতিটির নির্দিষ্ট পরামিতি দৈর্ঘ্য
এলশান

4
@ ওলাটুভসন, সৌভাগ্যক্রমে, যদিও ব্যবহারকারী 5777984 দীর্ঘ এবং সম্ভবত এটি কখনই দেখতে পাবে না, আজকের হিসাবে (8 অক্টোবর, 2020) এটি 270 কে ওভার টাইমকে দেখা গেছে ! সুতরাং, এটি অজানা ব্যবহারকারীকে ফেরত দেওয়ার ক্ষেত্রে, এটি 270 কে হিসাবে এত বেশি ব্যবহারকারী উপকৃত হয়েছে!
ড্যান

85

আমি মনে করি আমার খুব গুরুত্বপূর্ণ একটি বিষয় পরিষ্কার করা দরকার, অন্যদের জন্য (আমার সহকর্মীর মতো) যারা এই থ্রেডটি পেরিয়ে এসেছেন এবং ভুল তথ্য পেয়েছেন।

প্রদত্ত উত্তর ("দশমিক (9,2) বা দশমিক (10,2) বা যাই হোক না কেন চেষ্টা করুন") সঠিক, তবে কারণ ("দশমিকের আগে অঙ্কের সংখ্যা বৃদ্ধি করুন") ভুল।

দশমিক (পি, গুলি) এবং সংখ্যাসূচক (পি, গুলি) উভয়ই যথার্থ এবং একটি স্কেল নির্দিষ্ট করে । "স্পষ্টতা" হ'ল দশমিকের বামে সংখ্যার সংখ্যা নয়, পরিবর্তে সংখ্যার মোট নির্ভুলতা।

উদাহরণস্বরূপ: দশমিক (2,1) 0.0 থেকে 9.9 এর অন্তর্ভুক্ত, কারণ যথার্থতা 2 ডিজিট (00 থেকে 99) এবং স্কেলটি 1 দশমিক (4,1) 10,000.0 থেকে 999.9 দশমিক (4,2) কভার করে 00.00 থেকে 99.99 দশমিক (4,3) 0.000 থেকে 9.999 পর্যন্ত কভার করে


7
স্পষ্টতা বৃদ্ধি এবং স্কেল একই ছাড়ার মাধ্যমে, আপনি হয় দশমিক সামনে ডিজিটের সংখ্যা বাড়িয়ে। সুতরাং আমি যা বলেছি তা ভুল নয় তবে এটি কীভাবে ভুল বোঝাবুঝির হতে পারে তা আমি দেখতে পাচ্ছি। আমি এটি সেভাবে বলেছিলাম কারণ ওপি মূলত কেবলমাত্র স্কেল বাড়িয়ে সমস্যাটি সমাধান করার চেষ্টা করছিল, তবে আপনি সঠিক; এটি মোট নির্ভুলতা যা বাড়ানো দরকার।
adam0101

1

আপনি যদি দশমিক (9,2) থেকে দশমিক (7,2) আকার কমিয়ে আনতে চান তবে আপনাকে বিদ্যমান ডেটা দশমিক (7,2) এর সাথে মানিয়ে নিতে হবে। হয় আপনাকে এই নতুন নম্বরগুলি মুছতে হবে আপনার নতুন আকারের সাথে মানিয়ে নেওয়ার জন্য এটি নামিয়ে ফেলতে হবে। যদি ক্ষেত্রটির জন্য কোনও ডেটা না থাকে আপনি আপডেট করার চেষ্টা করছেন এটি সমস্যা ছাড়াই এটি স্বয়ংক্রিয়ভাবে করবে


0

CAST ফাংশনের ঠিক একই পদ্ধতিতে TRY_CAST ফাংশনটি ব্যবহার করুন। TRY_CAST একটি স্ট্রিং নেয় এবং এএস কীওয়ার্ডের পরে নির্দিষ্ট একটি ডেটা টাইপে এটি কাস্ট করার চেষ্টা করে। যদি রূপান্তর ব্যর্থ হয়, TRY_CAST ব্যর্থ হওয়ার পরিবর্তে একটি NUL প্রদান করে।


4
TRY_CAST একটি অভিব্যক্তি নেয়, যার মান castালাই করা হয়। আপনি এটি স্থাপন হিসাবে কেবল স্ট্রিং না।
টিটি।

যদিও এটি ত্রুটি ছাড়াই রুটিনটি সম্পূর্ণ করার অনুমতি দেবে, এটি ডেটা হারানো ব্যয় হবে। ত্রুটির জন্য উদ্দেশ্যটি হ'ল হ'ল ডেটা হারিয়ে যাওয়া রোধ করার জন্য হস্তক্ষেপ প্রয়োজন indicate আপনার সমাধানটি কেবল তখনই কাজ করবে যদি আপনি ফলাফলটি উপস্থিত থাকে কি না তা যদি সত্যই যত্নবান না হন।
ড্যান

-2

আপনার মানটি যা আপনি পূর্ণসংখ্যা কলামে সঞ্চয় করতে চান তা পরীক্ষা করুন। আমি মনে করি এটি পূর্বে পূর্ণসংখ্যার পরিসর বেশি। আপনি যদি মান আরও বড় করতে চান তবে পূর্ণসংখ্যার ব্যাপ্তি। আপনার বিগিন্ট ডেটাটাইপ ব্যবহার করা উচিত


ওপি ইঙ্গিত করে যে প্রশ্নের কলামটি সংখ্যাযুক্ত, সংখ্যার নয় (ত্রুটি বার্তা দ্বারা নির্দেশিত হিসাবে "গাণিতিক ওভারফ্লো ত্রুটি সংখ্যাকে ডেটা টাইপের সংখ্যায় রূপান্তর করে।") এবং শীর্ষ পোস্টের উত্তরগুলি এটিকে সঠিকভাবে সম্বোধন করে। আপনার উত্তরটি সমস্যাটি সঠিকভাবে সনাক্ত করে (ফলাফল সংরক্ষণের জন্য অপর্যাপ্ত ঘর) তবে প্রশ্নের মূল অভিপ্রায়টি মিস করে।
ড্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.