为什么我将此 "Arithmetic overflow error converting numeric to data type numeric" 获取到 Microsoft SQL 服务器上的这个简单插入查询中?

Why I obtain this "Arithmetic overflow error converting numeric to data type numeric" into this simple insert query on Microsoft SQL Server?

我是数据库的新手,在 Microsoft SQL Server.

上插入一条记录的插入查询有一些问题

所以我有这个 QS_TirPolizza table 具有以下字段:

ID  bigint
Polizzaid   bigint
BankerID    varchar
ReteVendita varchar
PercentualeRendimentoDaInizioGestione   decimal
PercentualeRendimentoDaInizioAnno   decimal
PercentualeRendimentoDaInizioTrimestre  decimal
DataCalcoloBF   datetime
AnnoRiferimento int
PremioInizialeVersato   money
PremiVersatiInAnnoRiferimento   money
ImportiRiscattatiInAnnoRiferimento  money
CedoleErogateInAnnoRiferimento  money
ControvaloreTotale  money
DataRiferimentoNav  datetime
RisultatoAnnuoInAnnoRiferimento money
PremioInizialeVersatoDaInizioGestione   money
PremiVersatiDaInizioGestione    money
ImportiRiscattatiDaInizioGestione   money
CedoleErogateDaInizioGestione   money
RisultatoAnnuoDaInizioGestione  money
CapitaleCasoMorte   money
Timestamp   datetime
QuoteTotale decimal
PercentualeRendimentoDaInizioMese   decimal
PercentualeRendimentoDaInizioSemestre   decimal
ControvaloreTotaleAnnoPrecedente    money
DataControvaloreTotaleAnnoPrecedente    datetime
MsgPercentualeRendimentoDaInizioAnno    varchar
MsgPercentualeRendimentoDaInizioGestione    varchar
MsgPercentualeRendimentoDaInizioMese    varchar
MsgPercentualeRendimentoDaInizioSemestre    varchar
MsgPercentualeRendimentoDaInizioTrimestre   varchar
isTirAnomalo    bit

这是我的插入查询:

insert into QS_TirPolizza(
    annoRiferimento, 
    bankerID, 
    controvaloreTotale, 
    dataCalcoloBF, 
    dataRiferimentoNav, 
    percentualeRendimentoDaInizioAnno, 
    percentualeRendimentoDaInizioGestione, 
    percentualeRendimentoDaInizioMese, 
    percentualeRendimentoDaInizioSemestre, 
    percentualeRendimentoDaInizioTrimestre, 
    polizzaId, 
    premioInizialeVersato, 
    premioInizialeVersatoDaInizioGestione, 
    quoteTotale, 
    reteVendita, 
    timestamp, 
    isTirAnomalo 
) values  ( 
    2015, 
    'XXXXXXXXXXXXXXXXXXXX', 
    2993197.200971, 
    '2015-05-30 14:22:54', 
    '2015-05-30 14:22:56', 
    -139852.94674, 
    -0.22452, 
    null, 
    null, 
    -115890.54469,
     123456789, 
    2999932.770000, 
    2999932.770000, 
    255388.71925, 
    'TEST', 
    '2015-05-30 14:23:25', 
    0 
) 

其中字段 percentualeRendimentoDaInizioAnnopercentualeRendimentoDaInizioGestionepercentualeRendimentoDaInizioMesepercentualeRendimentoDaInizioSemestre percentualeRendimentoDaInizioTrimestre 在 table 定义中有 decimal 类型。

问题是在执行之前的查询时我收到以下错误消息并且未插入记录:

15:00:14 [INSERT - 0 row(s), 0.000 secs] [Error Code: 8115, SQL State: S0008] Arithmetic overflow error converting numeric to data type numeric.

我认为问题在于这些值的位数太多,因为减少与这些数字的整体和小数部分相关的数字可以正常工作。事实上,查询的第二个版本(前面字段的数字较少)工作正常:

insert into QS_TirPolizza(
    annoRiferimento, 
    bankerID, 
    controvaloreTotale, 
    dataCalcoloBF, 
    dataRiferimentoNav, 
    percentualeRendimentoDaInizioAnno, 
    percentualeRendimentoDaInizioGestione, 
    percentualeRendimentoDaInizioMese, 
    percentualeRendimentoDaInizioSemestre, 
    percentualeRendimentoDaInizioTrimestre, 
    polizzaId, 
    premioInizialeVersato, 
    premioInizialeVersatoDaInizioGestione, 
    quoteTotale, 
    reteVendita, 
    timestamp, 
    isTirAnomalo 
) values  ( 
    2015, 
    'XXX123YYY', 
    2993197.200971, 
    '2015-05-30 14:22:54', 
    '2015-05-30 14:22:56', 
    -139.9, 
    -0.22, 
    null, 
    null, 
    -110.54469,
     1234567890, 
    2999932.770000, 
        2999932.770000, 
        255388.71925,
    'ISPB', 
    '2015-05-30 14:23:25', 
    0 
) 

这些值是由 Java 应用程序生成的,我无法截断它,我该怎么办?在 SQL 服务器上是否存在可以正确包含这些数据的更好的数据类型?

在 SQL 服务器中创建 table 时,您应该提及数据类型的大小。在您的情况下,您应该提到精度和比例。请更改您的 table 数据类型,如下所示。

Decimal to Decimal(18,6)
Varchar to Varchar(500)

进行适当的更改后,运行 插入脚本

您有一些需要小数点的列,但在 table 定义中您使用 Decimal 作为数据类型。您应该注意 Decimal 数据类型没有任何小数点,如果您需要任何小数点,您需要将其定义为 Decimal(X,X).

所以像 controvaloreTotale 这样有小数点的列应该是 Decimal(X,X) 数据类型。

Decimal Data type