Sigo recibiendo este mensaje de error cada vez que ejecuto esta consulta:
Msg 8115, Level 16, State 8, Line 33
Arithmetic overflow error converting numeric to data type numeric.
The statement has been terminated.
Pero si cambio la tabla de creación a (7,0), no obtengo el mensaje de error. Pero necesito que mis datos se muestren como un decimal. He probado 8,3 no funciona.
¿Hay alguien que pueda ayudarme a trabajar en esto? Cualquier ayuda será muy apreciada.
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
usuario572984
fuente
fuente
Respuestas:
Supongo que está intentando introducir un número superior a 99999,99 en sus campos decimales. Cambiarlo a (8,3) no servirá de nada si es mayor que 99999.999; debe aumentar el número de dígitos antes del decimal. Puede hacer esto aumentando la precisión (que es el número total de dígitos antes y después del decimal). Puede dejar la escala igual a menos que necesite modificar la cantidad de decimales que debe almacenar. Tratar
decimal(9,2)
odecimal(10,2)
lo que sea.Puede probar esto comentando
insert #temp
y ver qué números le da la declaración de selección y ver si son más grandes de lo que puede manejar su columna.fuente
Database field length
es igual aDataTableAdapter
la longitud de esa columna específica - Longitud del parámetro específico del procedimiento almacenadoSiento que necesito aclarar una cosa muy importante, para otros (como mi compañero de trabajo) que encontraron este hilo y obtuvieron la información incorrecta.
La respuesta dada ("Pruebe con decimal (9,2) o decimal (10,2) o lo que sea") es correcta, pero la razón ("aumentar el número de dígitos antes del decimal") es incorrecta.
decimal (p, s) y numérico (p, s) ambos especifican una Precisión y una Escala . La "precisión" no es el número de dígitos a la izquierda del decimal, sino la precisión total del número.
Por ejemplo: decimal (2,1) cubre 0.0 a 9.9, porque la precisión es de 2 dígitos (00 a 99) y la escala es 1. decimal (4,1) cubre 000.0 a 999.9 decimal (4,2) cubre 00.00 a 99,99 decimal (4,3) cubre 0,000 a 9,999
fuente
Si desea reducir el tamaño a decimal (7,2) desde decimal (9,2), tendrá que contabilizar los datos existentes con valores mayores para que quepan en decimal (7,2). O tendrá que eliminar esos números y truncarlos para que se ajusten a su nuevo tamaño. Si no había datos para el campo que está intentando actualizar, lo hará automáticamente sin problemas.
fuente
Utilice la función TRY_CAST exactamente de la misma manera que la función CAST. TRY_CAST toma una cadena e intenta convertirla en un tipo de datos especificado después de la palabra clave AS. Si la conversión falla, TRY_CAST devuelve un NULL en lugar de fallar.
fuente
verifique el valor que desea almacenar en la columna de números enteros. Creo que esto es mayor que el rango de números enteros. si desea almacenar un valor mayor que el rango de números enteros. deberías usar el tipo de datos bigint
fuente