2012-08-23 94 views
3

我我的SQL Server 2005中的錯誤SQL 8115算術溢出錯誤轉換數字數據類型數字

Server: Msg 8115, 
Arithmetic overflow error converting numeric to data type numeric. 

當我嘗試插入一個值上獲得= X(十進制(3,2))* Y(INT)
在一列MYCOLUMN類型DECIMAL (10,3)

如何解決這個問題呢?

UPDATE

一些代碼波紋管,以瞭解情況

-- ============================================================ 
-- 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 
+3

使用正確的數據類型的SQL Fiddle with demo?看起來像「DECIMAL(10,3)」不夠大。我們不能告訴你什麼是正確的,除非你告訴我們X和Y的最大值。 –

+0

@Aaron Bertrand:你是什麼意思「X和Y的最大值」? – serhio

+2

@serhio我認爲他的意思正是他所說的。什麼是您期望傳遞給X和Y的最小和最大值? – Mansfield

回答

5

必要的規模,精度和長度的規則是well covered in MSDN documentation

十進制只是一個縮放整數,所以我們來看一個沒有小數點的例子。

例如X DECIMAL(3, 0)Y DECIMAL(3, 0)其中X = 100Y = 100X * Y = 10000這將不適合在DECIMAL(3, 0),並且需要DECIMAL(5, 0)。其實,999 * 999 = 998001這將需要DECIMAL(6, 0)

因此,如果目標列的容量至少與MSDN表中針對不同操作的公式所指示的容量相同,則只適用於插入乘以兩個十進制列的結果。

2

假設X和Y的最大的產品可以1 111 111 111,111,你在你的評論指出,只要改變MyColumndecimal(13, 3)

試試看:

DECLARE @x decimal(13, 3) 
SET @x = 1111111111.111 

沒有錯誤。

您根本不能在decimal(10, 3)中儲存1 111 111 111,111

+0

對不起,我是SQL新手,請原諒我。我發佈了一些代碼來解釋。考慮最高'1 111 111,111' – serhio

4

你這裏有兩種選擇:

一是擴大VALUE字段的大小在表#GP_WGENSVCTH。顯然,decimal(10,3)不夠大,無法保存您嘗試插入的值。

二是改變了列的數據類型的表#GP_WGENSVCTHfloat

VALUE float 

更改爲浮動,您將不必擔心值是對精度和規模過大您爲十進制

declare @dec decimal(10, 3) = 1111111.111 
declare @int int = 3 

declare @float float 

set @float = @dec * @int 

select @float 

設置見上面的代碼

+0

感謝您的演示。 – Rama

相關問題