5

SQLServer2005でエラーが発生します

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

入力 した列に値= X(DECIMAL(3,2))* Y(INT)を挿入しようとすると
MYCOLUMNDECIMAL (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 
4

3 に答える 3

8

必要なスケール、精度、および長さのルールは、MSDNドキュメントで詳しく説明されています

Decimalはスケーリングされた整数なので、小数点のない例を見てみましょう。

たとえばX DECIMAL(3, 0)Y DECIMAL(3, 0)whereX = 100Y = 100X * Y = 10000はに収まらず、DECIMAL(3, 0)が必要DECIMAL(5, 0)です。実際には、999 * 999 = 998001これにはが必要ですDECIMAL(6, 0)

したがって、2つの小数列を乗算した結果を挿入しようとすると、宛先列に、さまざまな操作のMSDNテーブルの式で示されている容量と少なくとも同じ容量がある場合にのみ適合します。

于 2012-08-23T18:51:58.287 に答える
5

ここには2つのオプションがあります。

VALUE1つは、テーブルのフィールドのサイズを拡張すること#GP_WGENSVCTHです。明らかに、decimal(10,3)は挿入しようとしている値を保持するのに十分な大きさではありません。

2つは、テーブルの列のデータ型を次のように変更することです#GP_WGENSVCTHfloat

VALUE float

フロートに変更すると、小数に設定した精度とスケールに対して値が大きすぎることを心配する必要はありません。

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

declare @float float

set @float = @dec * @int

select @float

上記のコードのデモを含むSQLFiddleを参照してください

于 2012-08-23T18:56:47.333 に答える
2

XとYの最大の積が1 111 111 111,111コメントで示したとおりであると仮定して、に変更MyColumndecimal(13, 3)ます。

試してみる:

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

エラーはありません。

1 111 111 111,111に保存することはできませんdecimal(10, 3)

于 2012-08-23T18:44:38.133 に答える