我在 SQL Server 2005 上遇到错误
Server: Msg 8115,
Arithmetic overflow error converting numeric to data type numeric.
当我尝试插入一个值时 =
X
(DECIMAL(3,2)) * Y
(INT)MYCOLUMN
栏中输入 DECIMAL (10,3)
如何解决这个问题?
更新
下面的一些代码可以了解情况
-- ============================================================
-- Table : GP_WGENTH
-- ============================================================
CREATE TABLE #GP_WGENTH
(
KEYINTERNAL CHAR(32) NOT NULL,
KEYHOUR INT NOT NULL,
FIRM CHAR(5) NOT NULL,
CENTRE CHAR(2) NOT NULL,
SERVICE CHAR(6) NOT NULL,
AGENT CHAR(5) NOT NULL,
VERSION VARCHAR(3) NOT NULL,
DATE_ROULEMENT DATETIME NOT NULL,
SERVICEINSTANCE SMALLINT NOT NULL,
TYPEHOUR CHAR(9) NOT NULL,
QUANTITEFIXE DECIMAL(12,2) NULL ,
TYPECMP INT NULL ,
PERCENTCALC DECIMAL(3,2) NULL
)
-- ============================================================
-- Table : GP_WGENSVCTH
-- ============================================================
CREATE TABLE #GP_WGENSVCTH
(
KEYINTERNAL CHAR(32) NOT NULL,
KEYHOUR INT NOT NULL,
FIRM CHAR(5) NOT NULL,
CENTRE CHAR(2) NOT NULL,
SERVICE CHAR(6) NOT NULL,
AGENT CHAR(5) NOT NULL,
VERSION VARCHAR(3) NOT NULL,
DATE_ROULEMENT DATETIME NOT NULL,
SERVICEINSTANCE SMALLINT NOT NULL,
TYPEHOUR CHAR(9) NOT NULL,
VALUE DECIMAL(10,3) NOT NULL
)
GO
INSERT INTO #GP_WGENSVCTH
(KEYINTERNAL,
KEYHOUR,
FIRM,
CENTRE,
SERVICE,
AGENT,
VERSION,
DATE_ROULEMENT,
SERVICEINSTANCE,
TYPEHOUR,
VALUE)
SELECT WTH.KEYINTERNAL,
WTH.KEYHOUR,
WTH.FIRM,
WTH.CENTRE,
WTH.SERVICE,
WTH.AGENT,
WTH.VERSION,
WTH.DATE_ROULEMENT,
WTH.SERVICEINSTANCE,
WTH.TYPEHOUR,
WTH.PERCENTCALC * SUM(SC.LENGTH) -- !!! BOOOM !!!!!!!!! HERE
FROM #GP_WGENTH WTH
INNER JOIN GP_SERVICE_HABILLAGE_COMPONENT SC
ON WTH.FIRM = SC.FIRM
AND WTH.CENTRE = SC.CENTRE
AND WTH.SERVICE = SC.SERVICE
AND WTH.VERSION = SC.VERSION
AND WTH.TYPECMP = SC.TYPECMP
WHERE WTH.KEYINTERNAL = 'august 23 2012 10:45:21:027PM '
AND SC.LENGTH IS NOT NULL
GROUP BY WTH.KEYINTERNAL,
WTH.KEYHOUR,
WTH.FIRM,
WTH.CENTRE,
WTH.SERVICE,
WTH.AGENT,
WTH.VERSION,
WTH.DATE_ROULEMENT,
WTH.SERVICEINSTANCE,
WTH.TYPEHOUR,
WTH.PERCENTCALC
MSDN 文档中详细介绍了必要的比例、精度和长度规则。
小数只是一个按比例缩放的整数,所以让我们看一个没有小数点的示例。例如
X DECIMAL(3, 0)
和
Y DECIMAL(3, 0)
,其中
X = 100
和
Y = 100
,
X * Y = 10000
不适合
DECIMAL(3, 0)
,需要
DECIMAL(5, 0)
。 事实上,
999 * 999 = 998001
需要
DECIMAL(6, 0)
。因此,只有当目标列的容量至少与 MSDN 表中针对不同操作的公式指示的容量一样大时,尝试插入两个小数列相乘的结果才适合。
一是扩大表
VALUE
中
#GP_WGENSVCTH
字段的大小。显然
decimal(10,3)
不够大,无法容纳您尝试插入的值。两个是将表中列的数据类型
#GP_WGENSVCTH
更改为
float
VALUE float
更改为浮点型,您就不必担心该值对于您为小数设置的精度和小数位数来说太大
declare @dec decimal(10, 3) = 1111111.111
declare @int int = 3
declare @float float
set @float = @dec * @int
select @float
参见上述代码的
1 111 111 111,111
,如您在评论中指出的那样,只需将
MyColumn
更改为
decimal(13, 3)
。尝试一下:
DECLARE @x decimal(13, 3)
SET @x = 1111111111.111
没有错误。
您根本无法将
1 111 111 111,111
存储在
decimal(10, 3)
中。
WTH.KEYINTERNAL = '2012 08 23 22:45:21.027'