Я получаю это сообщение об ошибке каждый раз, когда выполняю этот запрос:
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
sql
sql-server-2008
user572984
источник
источник
Ответы:
Я предполагаю, что вы пытаетесь втиснуть число больше 99999,99 в свои десятичные поля. Изменение его на (8,3) ничего не даст, если оно больше 99999.999 - вам нужно увеличить количество цифр перед десятичной дробью. Вы можете сделать это, увеличив точность (которая представляет собой общее количество цифр до и после десятичной дроби). Вы можете оставить шкалу без изменений, если вам не нужно изменять количество десятичных знаков для хранения. Попробуйте
decimal(9,2)
илиdecimal(10,2)
или любой другой .Вы можете проверить это, закомментировав
insert #temp
и посмотрев, какие числа дает вам оператор select, и посмотреть, больше ли они, чем может обработать ваш столбец.источник
Database field length
равно лиDataTableAdapter
этому конкретному столбцу Длина - конкретный параметр хранимой процедуры ДлинаЯ чувствую, что мне нужно прояснить одну очень важную вещь для других (например, моего коллеги), которые наткнулись на эту ветку и получили неверную информацию.
Полученный ответ («Попробуйте десятичное (9,2) или десятичное (10,2) или что-то еще.») Правильный, но причина («увеличить количество цифр перед десятичным») неверна.
десятичное (p, s) и числовое (p, s) оба определяют точность и масштаб . «Точность» - это не количество цифр слева от десятичной дроби, а общая точность числа.
Например: десятичное (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,2) с десятичного (9,2), вам придется учитывать существующие данные со значениями, большими, чтобы соответствовать десятичному (7,2). Либо вам придется удалить эти числа, либо усечь их, чтобы они соответствовали вашему новому размеру. Если не было данных для поля, которое вы пытаетесь обновить, оно сделает это автоматически без проблем.
источник
Используйте функцию TRY_CAST точно так же, как функцию CAST. TRY_CAST принимает строку и пытается привести ее к типу данных, указанному после ключевого слова AS. Если преобразование не удается, TRY_CAST возвращает NULL вместо ошибки.
источник
проверьте свое значение, которое вы хотите сохранить в целочисленном столбце. Я думаю, что это больше, чем диапазон целых чисел. если вы хотите сохранить значение больше целого диапазона. вы должны использовать тип данных bigint
источник