2016-07-04 6 views
-1

Я довольно новичок в базе данных, и у меня есть некоторые проблемы с этим вставным запросом, который вставляет запись на Microsoft SQL Server.Почему я получаю эту ошибку «Арифметическая ошибка переполнения, преобразующая числовые данные в числовой тип данных» в этот простой запрос на вставку на Microsoft SQL Server?

Так я это QS_TirPolizza стол, имеющий следующие поля:

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 имеет decimal как тип определения таблицы.

Проблема заключается в том, что выполнение предыдущего запроса я получить следующее сообщение об ошибке, и запись не вставлена:

15:00:14 [ВСТАВИТЬ - 0 строк (ы), 0.000 сек] [Ошибка Код: 8115, SQL Состояние: S0008] Ошибка арифметического переполнения, преобразующая числовые данные в данные Тип числовой.

Я думаю, что проблема в том, что эти значения имеют много цифр, потому что сокращение цифр, связанных со всем, и до десятичных разделов этого числа, отлично работает. Infact этот второй вариант запроса (то есть число с меньшим количеством цифр для предыдущих полей) работает отлично:

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-сервере?

ответ

1

Вы должны указать размер типа данных при создании таблиц на SQL Server. В вашем случае вы должны указать точность и масштаб. Пожалуйста, измените тип данных в таблице, как показано ниже.

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

После того, как вы сделали соответствующие изменения затем запустить ваш скрипт вставки

1

У вас есть несколько столбцов, которые нуждаются десятичной точка, но в определении таблицы вы использовали Decimal как тип данных. Следует обратить внимание на то, что тип данных Decimal не имеет десятичной точки, и если вам нужна десятичная точка, вам необходимо определить ее как Decimal(X,X).

Таким образом, такие столбцы, как controvaloreTotale, который имеет десятичную точку, должны получать Decimal(X,X) тип данных.

Decimal Data type