I have two databases on the same SQL Server. Same code.
I have a stored procedure with an input parameter @Test INT
. In one database when I pass a NUMERIC
value into that input, it gets truncated and everything works fine. In the other one, when doing the same thing, I get the following error:
Error converting data type numeric to int
Here is the stored procedure signature:
CREATE PROCEDURE [dbo].[blProductGetTariff]
(
@CurrencyID INT,
@ProductID INT,
@TradeDate DATETIME,
@TotalDays INT,
@onTariff NUMERIC(22, 10) OUTPUT
)
And here’s how I invoke that stored procedure:
EXEC blProductGetTariff @CurrencyID,
@MTPLY_VolumeID,
@TradeDate,
@VolumeParam,
@VolumeMultiplierRate OUTPUT
@VolumeParam
is numeric and it gets fed fine into @TotalDays
in one db, but not in the second one.
What would be the possible database setting responsible for this, and is there one? Or I’m missing something, and there are other reasons for this weird behaviour?
UPDATE: Darin made a very good point in one of his comments below: «Also, looking at your code above, you might be overflowing the int if you are passing a numeric(22,10). In which case you have to make the numeric smaller or pass a bigint».. He was right. So changing INT to BIGINT resolved the problem, although I still do not understand why it does not happen in the first database, where everything works fine with INT and I use exactly the same data(actually the same file) for testing.
I have the following SQL statement. In it I need to convert some numbers stored as varchar to decimal in order to sum them.
When I run this SQL against my constraints I get this message:
Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the varchar value ‘1635.34’ to data
type int.
Which baffles me because I am casting my data as decimal. It also baffles me because when I use different constraints that have the same type of data in the field (1234.56
type of format) it works. That data is in the TotalPremium
field.
(My logic is a bit complex so that is why SQL statement is complex. I am posting all of it for clarity sake. Also, redesigning database table field type is not an option at this point.)
SELECT Account_No, version_num, LineOfBus, ProductNo, QuoteNo, Sum(Cast(TotalPremium as Decimal(16,2))) TotalPremium
FROM
(SELECT t.Account_No, t.version_num,
CASE
WHEN t.PackageIndicator = '1' THEN 'Package' Else t.Lob
END AS LineOfBus,
t.ProductNo, t.QuoteNo, Cast(COALESCE(t.TotalPremium,0) as decimal(16,2)) TotalPremium
FROM uAccountProductInfo as T
WHERE t.version_num IN
(SELECT sqVersionNumber.version_num
FROM
/* this captures unique package product records (or just stand alone records as well) */
(SELECT DISTINCT sqUnique.version_num, Count(sqUnique.version_num) VersionCount
FROM
/* grab list of all uniquer version, product, quote combinations (use distinct to combine package */
(SELECT DISTINCT version_num, productNo, quoteNo
FROM uAccountProductInfo
WHERE Account_No = '1172014' /* pass as parameter */
AND ProductNo IN ('6472930', '6474927') /* pass as parameter */
AND QuoteNo IN ('724185-01', '881957-08') /* pass as parameter */
) AS sqUnique
GROUP BY version_num
HAVING Count(version_num) = 2 /* pass as variable based on number of products, quotes */
) as sqVersionNumber
)
AND t.Account_no = '1172014' /* pass as parameter */
AND t.ProductNo IN ('6472930', '6474927') /* pass as parameter */
AND t.QuoteNo IN ('724185-01', '881957-08') /* pass as parameter */) as sqLOB
GROUP BY Account_No, version_num, LineOfBus, ProductNo, QuoteNo
В работе клиент серверной 1С иногда появляется сообщение:
Ошибка выполнения запроса
по причине:
Ошибка при выполнении операции над данными:
Microsoft OLE DB Provider for SQL Server: Arithmetic overflow error converting numeric to data type numeric.
HRESULT=80040E57, SQLSrvr: SQLSTATE=22003, state=8, Severity=10, native=8115, line=1
Если данная ошибка появляется под управлением MS SQL 2000, то рекомендуется проверить и установить обновление SP до SP4.
Но для SQL 2005 и 2008 появление такой ошибки не решается обновлением сервиспака.
Вообще появление указанной ошибки вызвано ошибкой в MS SQL при выполнении операции округления, например:
. касательно 1С и запросов выполняемых в ней, указанная ошибка может появляться при выполнении команды: ВЫРАЗИТЬ(ЕСТЬNULL(
Если в качестве операнда будет число со значением после запятой .5, в этом случае SQL считает/разбирает значение как литерал х.5 и преобразует к данным типа Numeric(2,1). Функция ROUND (округления) отрабытывает правильно получая округленный результат и затем пытается сохранить как данные в формате Numeric(2,1), что не правильно и мы получаем сообщение «arithmetic overflow».
Если у Вас возникает такая ошибка, то попробуете использвать преобразование:
ВЫРАЗИТЬ(ЕСТЬNULL(
, ГДЕ
{НОВОЕ значение} — Это увеличенное на один (несколько) разряд значение, в это случае ошибки не будет возникать.
Автор решения Александр Шарафан
54 / 6 / 5 Регистрация: 24.01.2019 Сообщений: 171 |
|
1 |
|
23.02.2021, 22:08. Показов 14874. Ответов 24
Делаю UPDATE таблицы Orders, конкретно поле Price(decimal) изPrice.Text, получаю:
0 |
Igr_ok 784 / 615 / 273 Регистрация: 04.08.2015 Сообщений: 1,707 |
||||
23.02.2021, 22:33 |
2 |
|||
7-2-3, вот тут MsGuns расписал, как не надо кодить, вам это тоже полезно Добавление записи в таблицу
Price.Text Если Price — это текстбокс, то откройте для себя другие контролы, которые позволяют работать с числами, датой и т.д. Для чисел — NumericUpDown https://docs.microsoft.com/en-… ew=net-5.0
1 |
54 / 6 / 5 Регистрация: 24.01.2019 Сообщений: 171 |
|
23.02.2021, 23:04 [ТС] |
3 |
Так это он мне и написал)
0 |
1496 / 1238 / 244 Регистрация: 04.04.2011 Сообщений: 4,360 |
|
23.02.2021, 23:23 |
4 |
Ошибка при преобразовании типа данных varchar к numeric. Обратите внимание на Decimalseparator https://docs.microsoft.com/en-… ew=net-5.0 Добавлено через 2 минуты
0 |
54 / 6 / 5 Регистрация: 24.01.2019 Сообщений: 171 |
|
24.02.2021, 08:50 [ТС] |
5 |
В России, копейки сами по себе конечно не очень нужны, только при расчёте НДС.
0 |
7-2-3 54 / 6 / 5 Регистрация: 24.01.2019 Сообщений: 171 |
||||||||||||
24.02.2021, 10:39 [ТС] |
6 |
|||||||||||
Поставил вместо текстбокса:
Прикрутил параметр:
Теперь немного другое сообщение получаю:
Миниатюры
0 |
7-2-3 54 / 6 / 5 Регистрация: 24.01.2019 Сообщений: 171 |
||||
24.02.2021, 10:50 [ТС] |
7 |
|||
NumberFormatInfo-эта штуковина, которая позволяет обходить проблемы с точками и запятыми(которые ещё в региональных настройках сидят) ? Добавлено через 4 минуты
Получил первоначальное сообщение. Добавлено через 5 минут
0 |
Andrey-MSK 1828 / 1286 / 262 Регистрация: 14.08.2018 Сообщений: 4,251 Записей в блоге: 4 |
||||||||
24.02.2021, 12:03 |
8 |
|||||||
7-2-3, в SQL (MS SQL) строки присваиваются так:
а числа так:
Разницу со своей записью видите?
0 |
784 / 615 / 273 Регистрация: 04.08.2015 Сообщений: 1,707 |
|
24.02.2021, 12:10 |
9 |
7-2-3, я не вижу на вашем скрине запроса с параметрами. И лучше подкрепляйте свои сообщения кодом(а не скрином), так проще указать на ошибки.
0 |
7-2-3 54 / 6 / 5 Регистрация: 24.01.2019 Сообщений: 171 |
||||
24.02.2021, 12:16 [ТС] |
10 |
|||
Вот, мой красивый и замечательный кодик:
0 |
Andrey-MSK 1828 / 1286 / 262 Регистрация: 14.08.2018 Сообщений: 4,251 Записей в блоге: 4 |
||||
24.02.2021, 12:29 |
11 |
|||
И где в запросе вот этот параметр? И все остальные тоже
0 |
MsGuns 1496 / 1238 / 244 Регистрация: 04.04.2011 Сообщений: 4,360 |
||||
24.02.2021, 13:01 |
12 |
|||
1 |
54 / 6 / 5 Регистрация: 24.01.2019 Сообщений: 171 |
|
25.02.2021, 14:12 [ТС] |
13 |
Если бы не Price, то моя «обновляшка» бы и без параметров сработала. Но в итоге, VS не нравится это: Миниатюры
0 |
Andrey-MSK 1828 / 1286 / 262 Регистрация: 14.08.2018 Сообщений: 4,251 Записей в блоге: 4 |
||||||||
25.02.2021, 15:35 |
14 |
|||||||
7-2-3, параметры можно объявлять по другому, это более полная запись, тут явно всё указывается — тип, значения, направление параметра:
Добавлено через 2 минуты
1 |
Igr_ok 784 / 615 / 273 Регистрация: 04.08.2015 Сообщений: 1,707 |
||||
25.02.2021, 17:54 |
15 |
|||
7-2-3, вместо
надо писать
0 |
1496 / 1238 / 244 Регистрация: 04.04.2011 Сообщений: 4,360 |
|
25.02.2021, 18:40 |
16 |
Igr_ok, Я в курсе: копипаста подвела + невнимательность
0 |
54 / 6 / 5 Регистрация: 24.01.2019 Сообщений: 171 |
|
25.02.2021, 19:46 [ТС] |
17 |
Я видимо что то не так делаю: Миниатюры
0 |
1496 / 1238 / 244 Регистрация: 04.04.2011 Сообщений: 4,360 |
|
25.02.2021, 23:24 |
18 |
Я видимо что то не так делаю: «Слепая» копипаста Откуда было известно как называются боксы Вашей формы, из которых извлекаются значения параметров. Вот и получили названия «по смыслу», теперь вместо них подставьте Ваши излюбленные TextBox298, TexBox100500 и т.д.
0 |
54 / 6 / 5 Регистрация: 24.01.2019 Сообщений: 171 |
|
26.02.2021, 10:23 [ТС] |
19 |
А вот и нет, я именно проименовал текстбоксы. ProductID.Text(и т.п.), оно так и было.
0 |
MsGuns 1496 / 1238 / 244 Регистрация: 04.04.2011 Сообщений: 4,360 |
||||
26.02.2021, 13:05 |
20 |
|||
Скобки уберите вокруг ProductID.Text:
0 |
If you’re receiving error Msg 8115, Level 16, Arithmetic overflow error converting expression to data type int in SQL Server, it could be that you’re performing a calculation that results in an out of range value.
This can happen when you use a function such as SUM()
on a column, and the calculation results in a value that’s outside the range of the column’s type.
Example of the Error
Here’s an example of code that produces the error:
SELECT SUM(bank_balance)
FROM accounts;
Result:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.
In this case I used the SUM()
function to get the sum of the bank_balance
column, which has a data type of int
.
The error occurred because the result of the calculation is outside the range of the int
data type.
Here’s all the data in my table:
SELECT bank_balance
FROM accounts;
Result:
+----------------+ | bank_balance | |----------------| | 1300000000 | | 1200000000 | | 800500000 | +----------------+
Those are some big bank balances… and adding the three of them results in a larger number than an int
can handle (the int
range is -2,147,483,648 to 2,147,483,647).
The Solution
We can deal with this error by converting the int
column to a bigint
when we run the query:
SELECT SUM(CAST(bank_balance AS bigint))
FROM Accounts;
Result:
3300500000
This time it worked.
You could also change the data type of the actual column for a more permanent solution.
In case you’re wondering, the bigint
range is -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807.
Same Error in Different Scenarios
The same error (Msg 8115) can also occur (with a slightly different error message) when you try to explicitly convert between data types and the original value is outside the range of the new type. See Fix “Arithmetic overflow error converting int to data type numeric” in SQL Server to fix this.
The same error (Msg 8115) can also occur (with a slightly different error message) when you try to insert data into a table when its IDENTITY
column has reached its data type’s limit. See Fix: “Arithmetic overflow error converting IDENTITY
to data type…” in SQL Server for how to fix this.