为什么我将此 "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
)
其中字段 percentualeRendimentoDaInizioAnno、percentualeRendimentoDaInizioGestione、percentualeRendimentoDaInizioMese、percentualeRendimentoDaInizioSemestre 、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)
数据类型。
我是数据库的新手,在 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
)
其中字段 percentualeRendimentoDaInizioAnno、percentualeRendimentoDaInizioGestione、percentualeRendimentoDaInizioMese、percentualeRendimentoDaInizioSemestre 、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)
数据类型。