Za każdym razem, gdy wykonuję to zapytanie, otrzymuję ten komunikat o błędzie:
Msg 8115, Level 16, State 8, Line 33
Arithmetic overflow error converting numeric to data type numeric.
The statement has been terminated.
Ale jeśli zmienię tabelę tworzenia na (7,0), nie otrzymuję komunikatu o błędzie, ale potrzebuję, aby moje dane były wyświetlane jako ułamek dziesiętny. Próbowałem 8,3 nie działa.
Czy jest ktoś, kto może mi w tym pomóc? Każda pomoc będzie bardzo mile widziana.
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
sql
sql-server-2008
user572984
źródło
źródło
Odpowiedzi:
Domyślam się, że próbujesz wcisnąć liczbę większą niż 99999,99 do pól dziesiętnych. Zmiana na (8,3) nic nie da, jeśli jest większa niż 99999,999 - musisz zwiększyć liczbę cyfr przed przecinkiem. Możesz to zrobić, zwiększając precyzję (czyli całkowitą liczbę cyfr przed i po przecinku). Możesz pozostawić tę samą skalę, chyba że musisz zmienić liczbę miejsc po przecinku do przechowywania. Spróbuj
decimal(9,2)
lubdecimal(10,2)
czy cokolwiek innego.Możesz to sprawdzić, wykomentowując
insert #temp
i zobaczyć, jakie liczby podaje instrukcja select i sprawdzić, czy są większe niż może obsłużyć Twoja kolumna.źródło
Database field length
równa się w celu uzyskaniaDataTableAdapter
tej konkretnej kolumny Długość - określony parametr procedury przechowywanej DługośćCzuję, że muszę wyjaśnić jedną bardzo ważną rzecz dla innych (na przykład mojego współpracownika), którzy natknęli się na ten wątek i otrzymali niewłaściwe informacje.
Podana odpowiedź („Spróbuj dziesiętnie (9,2) lub dziesiętnie (10,2) lub cokolwiek innego”) jest poprawna, ale powód („zwiększ liczbę cyfr przed przecinkiem”) jest błędny.
dziesiętne (p, s) i numeryczne (p, s) określają precyzję i skalę . „Precyzja” nie jest liczbą cyfr po lewej stronie przecinka, ale całkowitą dokładnością liczby.
Na przykład: dziesiętne (2,1) obejmuje od 0,0 do 9,9, ponieważ dokładność wynosi 2 cyfry (od 00 do 99), a skala wynosi 1. dziesiętne (4,1) obejmuje od 000,0 do 999,9 dziesiętne (4,2) obejmuje od 00,00 do 99,99 dziesiętnie (4,3) obejmuje od 0,000 do 9,999
źródło
Jeśli chcesz zmniejszyć rozmiar do dziesiętnego (7,2) od dziesiętnego (9,2), będziesz musiał uwzględnić istniejące dane z wartościami większymi, aby zmieścić się w dziesiętnym (7,2). Albo będziesz musiał usunąć te liczby, przyciąć je w celu dopasowania do nowego rozmiaru. Jeśli nie ma danych dla pola, które próbujesz zaktualizować, zrobi to automatycznie bez problemów
źródło
Użyj funkcji TRY_CAST w dokładnie taki sam sposób, jak funkcja RZUCANIE. TRY_CAST pobiera ciąg i próbuje rzutować go na typ danych określony po słowie kluczowym AS. Jeśli konwersja nie powiedzie się, TRY_CAST zwraca NULL zamiast niepowodzenia.
źródło
sprawdź swoją wartość, którą chcesz przechowywać w kolumnie całkowitej. Myślę, że to jest większe niż zakres liczby całkowitej. jeśli chcesz przechowywać wartość większą niż zakres liczb całkowitych. powinieneś użyć typu danych bigint
źródło