SQL 8115 将数字转换为数据类型数字时出现算术溢出错误

问题描述 投票:0回答:4

我在 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 
sql sql-server-2005
4个回答
8
投票

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 表中针对不同操作的公式指示的容量一样大时,尝试插入两个小数列相乘的结果才适合。


5
投票
您有两个选择:

一是扩大表

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

参见上述代码的

SQL Fiddle with demo


2
投票
假设 X 和 Y 的最大乘积可以是

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)
 中。


0
投票
这只是“WHERE”行上的格式错误...最后一个冒号不是冒号,它应该是小数:

WTH.KEYINTERNAL = '2012 08 23 22:45:21.027'

© www.soinside.com 2019 - 2024. All rights reserved.