Ошибка при преобразовании типа данных numeric к int

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(ВремяПоГрафикуВЧасахНорма, 0) КАК ЧИСЛО(5, 2)) КАК WorkingHours

Если в качестве операнда будет число со значением после запятой .5, в этом случае SQL считает/разбирает значение как литерал х.5 и преобразует к данным типа Numeric(2,1). Функция ROUND (округления)  отрабытывает правильно получая округленный результат и затем пытается сохранить как данные в формате Numeric(2,1), что не правильно и мы получаем сообщение «arithmetic overflow».

Если у Вас возникает такая ошибка, то попробуете использвать преобразование:

ВЫРАЗИТЬ(ЕСТЬNULL(ВремяПоГрафикуВЧасахНорма, 0) КАК ЧИСЛО(  {НОВОЕ значение} , 2)) КАК WorkingHours

, ГДЕ

     {НОВОЕ значение} — Это увеличенное на один (несколько) разряд значение, в это случае ошибки не будет возникать.

Автор решения Александр Шарафан

54 / 6 / 5

Регистрация: 24.01.2019

Сообщений: 171

1

23.02.2021, 22:08. Показов 14874. Ответов 24


Студворк — интернет-сервис помощи студентам

Делаю UPDATE таблицы Orders, конкретно поле Price(decimal) изPrice.Text, получаю:
Ошибка при преобразовании типа данных varchar к numeric.
Проблема в том что, в этом поле число с запятой, если запятую убирать то «обновляшка» срабатывает, но я же не могу цену в целочисленном типе писать.
Как это победить ?



0



Igr_ok

784 / 615 / 273

Регистрация: 04.08.2015

Сообщений: 1,707

23.02.2021, 22:33

2

7-2-3, вот тут MsGuns расписал, как не надо кодить, вам это тоже полезно Добавление записи в таблицу

Цитата
Сообщение от 7-2-3
Посмотреть сообщение

Price.Text

Если Price — это текстбокс, то откройте для себя другие контролы, которые позволяют работать с числами, датой и т.д. Для чисел — NumericUpDown https://docs.microsoft.com/en-… ew=net-5.0
Запрос пишете с параметрами, добавляя параметр так:

C#
1
command.Parameters.AddWithValue(@Price, numericUpDown1.Value);



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

Цитата
Сообщение от 7-2-3
Посмотреть сообщение

Ошибка при преобразовании типа данных 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

Поставил вместо текстбокса:

C#
1
+ "',Price='" + numericUpDown1+

Прикрутил параметр:

C#
1
myCommand.Parameters.AddWithValue("@Price", numericUpDown1.Value);

Теперь немного другое сообщение получаю:

C#
1
2
3
Ошибка арифметического переполнения при преобразовании varchar к типу данных numeric.
 
Выполнение данной инструкции было прервано.

Миниатюры

Ошибка при преобразовании типа данных varchar к numeric
 



0



7-2-3

54 / 6 / 5

Регистрация: 24.01.2019

Сообщений: 171

24.02.2021, 10:50

 [ТС]

7

NumberFormatInfo-эта штуковина, которая позволяет обходить проблемы с точками и запятыми(которые ещё в региональных настройках сидят) ?

Добавлено через 4 минуты
Попробовал

C#
1
+ "',Price='" + numericUpDown1.Value+

Получил первоначальное сообщение.
Ошибка при преобразовании типа данных varchar к numeric.

Добавлено через 5 минут
Попробовал numericUpDown1.DecimalPlaces, но он мне количество знаков после запятой и показывает, т.е. «2»



0



Andrey-MSK

1828 / 1286 / 262

Регистрация: 14.08.2018

Сообщений: 4,251

Записей в блоге: 4

24.02.2021, 12:03

8

7-2-3, в SQL (MS SQL) строки присваиваются так:

T-SQL
1
SET TextField = 'SomeText'

а числа так:

T-SQL
1
SET NumField = 45.89

Разницу со своей записью видите?



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

Вот, мой красивый и замечательный кодик:

C#
1
2
3
 SqlCommand myCommand = conn.CreateCommand();
                myCommand = new SqlCommand("UPDATE Orders SET  ProductID='" + ProductID.Text + "',Qty='" + Qty.Text + "',Price='" + numericUpDown1.Value + "' WHERE OrderID='" + OrderID + "' AND LineItem='" + LineItem + "' ", conn);
                myCommand.Parameters.AddWithValue("@Price", numericUpDown1.Value);



0



Andrey-MSK

1828 / 1286 / 262

Регистрация: 14.08.2018

Сообщений: 4,251

Записей в блоге: 4

24.02.2021, 12:29

11

Цитата
Сообщение от 7-2-3
Посмотреть сообщение

C#
1
myCommand.Parameters.AddWithValue("@Price", numericUpDown1.Value);

И где в запросе вот этот параметр? И все остальные тоже



0



MsGuns

1496 / 1238 / 244

Регистрация: 04.04.2011

Сообщений: 4,360

24.02.2021, 13:01

12

C#
1
2
3
4
5
6
7
myCommand = new SqlCommand("UPDATE Orders SET  ProductID=@product, Qty=@quant, Price=@price " +
              "WHERE OrderID=@orderid AND LineItem=@lineitem", conn);
myCommand.Parameters.AddWithValue("@product", Int32(ProductID.Text));
myCommand.Parameters.AddWithValue("@quant", Int32(Qty.Text));
myCommand.Parameters.AddWithValue("@price", numericUpDown1.Value);
myCommand.Parameters.AddWithValue("@orderid", Int32(OrderID));
myCommand.Parameters.AddWithValue("@lineitem", LineItem);



1



54 / 6 / 5

Регистрация: 24.01.2019

Сообщений: 171

25.02.2021, 14:12

 [ТС]

13

Если бы не Price, то моя «обновляшка» бы и без параметров сработала.
Ну я же примерно то же самое в своём коде написал, параметр для Price указать был, остальные просто не стал впихивать.

Но в итоге, VS не нравится это:

Миниатюры

Ошибка при преобразовании типа данных varchar к numeric
 



0



Andrey-MSK

1828 / 1286 / 262

Регистрация: 14.08.2018

Сообщений: 4,251

Записей в блоге: 4

25.02.2021, 15:35

14

7-2-3, параметры можно объявлять по другому, это более полная запись, тут явно всё указывается — тип, значения, направление параметра:

C#
1
2
3
4
5
6
7
8
                    SqlParameter param = new SqlParameter
                    {
                        ParameterName = "@idDraw",
                        Value = drawID,
                        SqlDbType = SqlDbType.Int,
                        Direction = ParameterDirection.Input
                    };
                    sqlCommand.Parameters.Add(param);

Добавлено через 2 минуты
7-2-3, и преобразование типов в DataReader:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
                    using (SqlDataReader dataReader = sqlCommand.ExecuteReader())
                    {
                        while (dataReader.Read())
                        {
                            draw.IDDraw = (int)dataReader["ID_Draw"];
                            draw.IDGenPlan = (int)dataReader["ID_GenPlan"];
                            draw.DrawNum = dataReader["DrawNum"] as string ?? "";
                            draw.DrawName = dataReader["DrawName"] as string ?? "";
                            draw.Stage = dataReader["Stage"] as string ?? "";
                            draw.StageTEP = (int)dataReader["StageTEP"];
                            draw.Works = dataReader["Works"] as string ?? "";
                        }
                    }



1



Igr_ok

784 / 615 / 273

Регистрация: 04.08.2015

Сообщений: 1,707

25.02.2021, 17:54

15

7-2-3, вместо

Цитата
Сообщение от MsGuns
Посмотреть сообщение

C#
1
Int32(ProductID.Text)

надо писать
ConvertToInt32(ProductID.Text) или (int)ProductID.Text.



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

Я видимо что то не так делаю:

Миниатюры

Ошибка при преобразовании типа данных varchar к numeric
 



0



1496 / 1238 / 244

Регистрация: 04.04.2011

Сообщений: 4,360

25.02.2021, 23:24

18

Цитата
Сообщение от 7-2-3
Посмотреть сообщение

Я видимо что то не так делаю:

«Слепая» копипаста Откуда было известно как называются боксы Вашей формы, из которых извлекаются значения параметров. Вот и получили названия «по смыслу», теперь вместо них подставьте Ваши излюбленные 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:

C#
1
  myCommand.Parameters.AddWithValue("@product", (int)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.

Понравилась статья? Поделить с друзьями:
  • Ошибка при применении параметров к драйверу сканера
  • Ошибка при предоставлении общего доступа к папке
  • Ошибка при предоставлении общего доступа к диску
  • Ошибка при предварительном просмотре при печати
  • Ошибка при потере внимания 9 букв сканворд