Ошибка арифметического переполнения при преобразовании nvarchar к типу данных numeric

I have a simple stored procedure where the target table and where clause condition are specified as parameters. The «Arithmetic overflow error converting nvarchar to data type numeric.» error is causing me a bit of frustration.

@TableName varchar(50), -- 'A_RECORD_ETH0' test value

@Time_ms decimal(18,4), -- '40388629085.6481' test value

@Records int out,       -- should result with '1' if test values are used

This works:

SELECT COUNT(*) as Count FROM A_RECORD_ETH0 WHERE Time_ms = 40388629085.6481

This works:

SET @sql = N'SET @Records = (SELECT COUNT(*) FROM A_RECORD_ETH0 WHERE Time_ms = 40388629085.6481 )'

EXEC sp_executesql @sql, N'@Records int output', @Records output

This works:

SET @sql = N'SET @Records = (SELECT COUNT(*) FROM '+ @TableName + ' WHERE Time_ms = 40388629085.6481 )'

EXEC sp_executesql @sql, N'@Records int output', @Records output

This results in the Arithmetic overflow error:

SET @sql = N'SET @Records = (SELECT COUNT(*) FROM '+ @TableName + ' WHERE Time_ms = ' + @Time_ms + ' )'

EXEC sp_executesql @sql, N'@Records int output', @Records output

This results in the Arithmetic overflow error even when cast is used:

SET @sql = N'SET @Records = (SELECT COUNT(*) FROM '+ @TableName + ' WHERE Time_ms = Cast ( ' + @Time_ms + ' as decimal(18,4)) )'

EXEC sp_executesql @sql, N'@Records int output', @Records output

54 / 6 / 5

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

Сообщений: 171

1

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


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

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



0



Igr_ok

783 / 615 / 272

Регистрация: 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,357

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

1646 / 1121 / 243

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

Сообщений: 3,673

Записей в блоге: 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



783 / 615 / 272

Регистрация: 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

1646 / 1121 / 243

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

Сообщений: 3,673

Записей в блоге: 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,357

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

1646 / 1121 / 243

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

Сообщений: 3,673

Записей в блоге: 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

783 / 615 / 272

Регистрация: 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,357

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,357

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,357

26.02.2021, 13:05

20

Скобки уберите вокруг ProductID.Text:

C#
1
  myCommand.Parameters.AddWithValue("@product", (int)ProductID.Text);



0



  

фпк1сл

31.01.16 — 21:52

Добрый день!

Конфигурация УТ 11.1.10.145, платформа 8.3.6.2237, SQL Server 2008.

При проведении документа «Расчет себестоимости товаров» за апрель, выскакивает ошибка

Ошибка при выполнении обработчика — ‘ОбработкаПроведения’

по причине:

{Документ.РасчетСебестоимостиТоваров.МодульОбъекта(2181)}: Ошибка при вызове метода контекста (ВыполнитьПакет)

        Выборка = Запрос.ВыполнитьПакет()[1].Выбрать();

по причине:

Ошибка выполнения запроса

по причине:

Ошибка при выполнении операции над данными:

Microsoft SQL Server Native Client 10.0: Ошибка арифметического переполнения при преобразовании numeric к типу данных numeric.

HRESULT=80040E57, SQLSrvr: SQLSTATE=22003, state=8, Severity=10, native=8115, line=1

Все  другие документы проводятся нормально. Подскажите пожалуйста, все чем может быть проблема, куда смотреть?

  

фпк1сл

1 — 31.01.16 — 21:53

Я понимаю, что где-то в результате запроса получается большое число, вот только как найти, откуда это число возникает?

  

cw014

2 — 01.02.16 — 07:37

Пройтись отладчиком + ТИИ

  

фпк1сл

3 — 01.02.16 — 11:57

Отладчик мне ничего не покажет, программа завершается в момент Выборка = Запрос.ВыполнитьПакет()[1].Выбрать(); , значит я не узнаю, что её выбивает. В файловом варианте база тоже не запускается, размер слишком большой.

  

Timon1405

4 — 01.02.16 — 12:04

обновитесь, говорят, на 11.1.10.150 проблема уходит.

  

Михаил Козлов

5 — 01.02.16 — 12:14

(3) Можно попробовать в консоли удалять из пакета по 1. Или выполнять по 1.

  

Карупян

6 — 01.02.16 — 12:16

профайлером (или тж) засечь запрос и посмотреть

  

фпк1сл

7 — 01.02.16 — 15:21

Обновляться буду в крайнем случае, попробую в технологическом журнале посмотреть на криминал. Профайлером не имею представления как пользоваться.

  

фпк1сл

8 — 02.02.16 — 16:16

Обновление не дало результатов. В ТЖ и профайлер смотрел — ничего не понял. Подскажите, может по какому нибудь регистру посмотреть какие нибудь значения подозрительные?

  

mikecool

9 — 02.02.16 — 16:19

(8) первый запрос из пакета генерит не перевариваемое число — посмотри, какие там числовые поля и попытайся понять, откуда мб такое большое

  

Timon1405

10 — 02.02.16 — 17:16

(8) поищите большой ресурс «ПостояннаяРазница» в регистре ВыручкаИСебестоимостьПродаж в консоли запросов

  

Tateossian

11 — 02.02.16 — 18:37

(0) Скорее всего, это происходит где-то при делении, попробуй все такие места явно обработать через ВЫРАЗИТЬ( КАК ЧИСЛО(xx,yy))

  

Cyberhawk

12 — 02.02.16 — 18:53

ИР тебе в помощь — там и разбивка запроса на подзапросы, и отбор ТЖ по конкретному запросу

  

фпк1сл

13 — 03.02.16 — 09:26

(11) В том то дело, все место обработаны через Выразить, запрос полностью типовой.

// 0 Расчет коэффициентов (количество перехода из состояния в состояние) уравнения.

        |ВЫБРАТЬ

        |    УзлыКорректировки.НомерУзла                                     КАК НомерУзла,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.Стоимость)                  КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициент,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьБезНДС)            КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентБезНДС,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.ПостояннаяРазница)          КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентПостояннаяРазница,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.ВременнаяРазница)           КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентВременнаяРазница,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьДопРасходы)        КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентДопрасходы,

        |    ВЫРАЗИТЬ(МАКСИМУМ(УзлыКорректировки.СтоимостьДопРасходыБезНДС)  КАК ЧИСЛО(23,10)) КАК СвободныйКоэффициентДопрасходыБезНДС,

        |

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК Стоимость,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьБезНДС, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК СтоимостьБезНДС,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК ПостояннаяРазница,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ВременнаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК ВременнаяРазница,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьДопРасходы, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК СтоимостьДопРасходы,

        |    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.СтоимостьДопРасходыБезНДС, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

        |        / УзлыКорректировки.Количество КАК СтоимостьДопРасходыБезНДС

        |

        |ПОМЕСТИТЬ ВременнаяТаблицаРешений

        |ИЗ

        |    ВтУзлыКорректировки КАК УзлыКорректировки

        |    ЛЕВОЕ СОЕДИНЕНИЕ ВтПеремещенияСписания КАК ПеремещенияСписания

        |        ПО УзлыКорректировки.НомерУзла = ПеремещенияСписания.НомерУзлаПриемник

        |    ЛЕВОЕ СОЕДИНЕНИЕ ВтТаблицаРешений КАК ВтТаблицаРешений

        |        ПО ПеремещенияСписания.НомерУзлаИсточник = ВтТаблицаРешений.НомерУзла

        |ГДЕ

        |    УзлыКорректировки.Количество <> 0

        |    И ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0) > -999999999.999999999

        |    И ЕСТЬNULL(ВтТаблицаРешений.Стоимость, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0) < 999999999.999999999

        |

        |СГРУППИРОВАТЬ ПО

        |    УзлыКорректировки.НомерУзла,

        |    УзлыКорректировки.Количество

        |

        |ИНДЕКСИРОВАТЬ ПО

        |    НомерУзла

        |;

        |/////////////////////////////////////////////////////////////////////////////

        // 1 Расчет ошибки расчета.

        |ВЫБРАТЬ

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.Стоимость,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициент

        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))) > 0 ТОГДА

        |

        |                    ЕСТЬNULL(ТаблицаРешений.Стоимость,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициент

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.Стоимость,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициент

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.Стоимость,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК Отклонение,

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС

        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))) > 0 ТОГДА

        |

        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьБезНДС,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьБезНДС,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеБезНДС,

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница

        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))) > 0 ТОГДА

        |

        |                    ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.ПостояннаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеПостояннаяРазница,

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА (ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница

        |             + ЕСТЬNULL(ВременнаяТаблицаРешений.ВременнаяРазница,0))) > 0 ТОГДА

        |

        |                    ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ПостояннаяРазница,0))

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.ВременнаяРазница,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.ВременнаяРазница,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеВременнаяРазница,

        |

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))> 0 ТОГДА

        |

        |                ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))

        |

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеДопрасходы,

        |    ЕСТЬNULL(

        |        МАКСИМУМ(

        |            ВЫБОР КОГДА ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))> 0 ТОГДА

        |

        |                ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))

        |

        |            ИНАЧЕ

        |                -(

        |                    ЕСТЬNULL(ТаблицаРешений.СтоимостьДопРасходы,0) — (ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |                     + ЕСТЬNULL(ВременнаяТаблицаРешений.СтоимостьДопРасходы,0))

        |                    )

        |            КОНЕЦ

        |            )

        |        ,0) КАК ОтклонениеДопрасходыБезНДС

        |ИЗ

        |    ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений

        |

        |        ЛЕВОЕ СОЕДИНЕНИЕ ВтТаблицаРешений КАК ТаблицаРешений

        |        ПО ВременнаяТаблицаРешений.НомерУзла = ТаблицаРешений.НомерУзла

        |;

        |//////////////////////////////////////////////////////////////

        // 2 Удаление таблиц.

        |УНИЧТОЖИТЬ ВтТаблицаРешений

        |;

        // 3 Суммирование коэффициентов.

        |//////////////////////////////////////////////////////////////

        |ВЫБРАТЬ

        |    ВременнаяТаблицаРешений.НомерУзла  КАК НомерУзла,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициент

        |            + ВременнаяТаблицаРешений.Стоимость

        |        КАК ЧИСЛО(23,10))              КАК Стоимость,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентБезНДС

        |            + ВременнаяТаблицаРешений.СтоимостьБезНДС

        |        КАК ЧИСЛО(23,10))              КАК СтоимостьБезНДС,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентПостояннаяРазница

        |            + ВременнаяТаблицаРешений.ПостояннаяРазница

        |        КАК ЧИСЛО(23,10))              КАК ПостояннаяРазница,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентВременнаяРазница

        |            + ВременнаяТаблицаРешений.ВременнаяРазница

        |        КАК ЧИСЛО(23,10))              КАК ВременнаяРазница,

        |

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходы

        |            + ВременнаяТаблицаРешений.СтоимостьДопРасходы

        |        КАК ЧИСЛО(23,10))              КАК СтоимостьДопРасходы,

        |    ВЫРАЗИТЬ(

        |        ВременнаяТаблицаРешений.СвободныйКоэффициентДопрасходыБезНДС

        |            + ВременнаяТаблицаРешений.СтоимостьДопРасходыБезНДС

        |        КАК ЧИСЛО(23,10))              КАК СтоимостьДопРасходыБезНДС

        |

        |ПОМЕСТИТЬ ВтТаблицаРешений

        |

        |ИЗ

        |    ВременнаяТаблицаРешений КАК ВременнаяТаблицаРешений

        |

        |ИНДЕКСИРОВАТЬ ПО

        |    НомерУзла

        |;

        |//////////////////////////////////////////////////////////////

        // 4 Удаление таблицы.

        |    УНИЧТОЖИТЬ ВременнаяТаблицаРешений

        |»;

  

фпк1сл

14 — 03.02.16 — 12:58

Запрос выполняется с использованием Менеджера временных таблиц

  

фпк1сл

15 — 03.02.16 — 13:02

Еще глупый вопрос, в запросе выполняется первый пакет. Как мне его найти?

  

фпк1сл

16 — 05.02.16 — 09:26

я вычислил, что всему виной вот эта строчка в запросе

|    ВЫРАЗИТЬ(СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0) * ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК ЧИСЛО(23,10))

Здесь и происходит переполнение.

  

Ёпрст

17 — 05.02.16 — 09:35

(16) выкини выразить оттуда

  

Ёпрст

18 — 05.02.16 — 09:35

и спи спокойно дальше

  

фпк1сл

19 — 05.02.16 — 09:42

(17) Не помогло, все та же ошибка преобразования numeric.

Что интересно, только за апрель документ выжучивается, следующий месяц проводится без проблем.

  

Ёпрст

20 — 05.02.16 — 09:43

ну поставь  КАК ЧИСЛО(15,0)

  

фпк1сл

21 — 05.02.16 — 09:53

(20) Все так же упрямо выскакивает эта ошибка.

  

НЕА123

22 — 05.02.16 — 10:00

СУММА(ЕСТЬNULL(ВтТаблицаРешений.ПостояннаяРазница, 0)) Как СуммаПР,

Сумма(ЕСТЬNULL(ПеремещенияСписания.Количество, 0)) КАК СуммаСписания,…

может дикие числа.

  

НЕА123

23 — 05.02.16 — 10:03

вообще, ИМХО, ВЫРАЗИТЬ в Сумма засунуть.

  

Tateossian

24 — 05.02.16 — 10:09

(16) Выведи в отладке содержимое ВтТаблицаРешений в ТЗ и посмотри, что там за числа.

  

фпк1сл

25 — 05.02.16 — 10:53

(23) выразил, снова ошибка. (24)  Глазами пробежался по 12к строк, на первый взгляд никакого криминала. Попробую покромсать запрос и выполнять по частям.

  

фпк1сл

26 — 05.02.16 — 13:11

Получается, что «ВтТаблицаРешений.ПостояннаяРазница» и «ПеремещенияСписания.Количество» имеют значение Null.

И если подставить, то получается, что выражение

ВЫРАЗИТЬ(СУММА(0 * 0) КАК ЧИСЛО(23,10)) — вызывает арифметическое переполнение.

  

фпк1сл

27 — 05.02.16 — 13:50

Был неправ, зайдя дальше обнаружил, что умножение «ВтТаблицаРешений.ПостояннаяРазница» и «ПеремещенияСписания.Количество» на какой то итерации дает переполнение, буду двигаться дальше.

  

фпк1сл

28 — 09.02.16 — 15:52

При проведении документа «Расчет себестоимости» формируются записи регистра накопления «Себестоимость товаров». Так вот за 2014 год все формировалось нормально, а с 2015 в колонке «Стоимость (ПР)» — постоянная разница, только по 2-3 номенклатурам начали появляться и расти огромные числа. Подскажите, из-за чего растет постоянная разница строго по 2 позициям номенклатуры?

  

фпк1сл

29 — 10.02.16 — 10:10

Пример. Одна организация, два склада.

Документ перемещения формирует две записи в регистре накопления — Количество(10) по двум складам.

Документ Расчет себестоимости товаров формирует одну запись — Стоимость(ПР) : 134 046 229,30.   Откуда такая цифра? Причем некоторые записи идут корректно, в чем разница, так и не понял.

В работе клиент серверной 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

, ГДЕ

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

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

#sql #sql-server #tsql

Вопрос:

Я обнаружил странную проблему в своей базе данных, я смог ее исправить, но я не понимаю, ПОЧЕМУ эта ошибка возникла в первую очередь. Я использую Microsoft SQL Server 2017.

Следующий код возвращает ошибку арифметического переполнения:

 SELECT '1000' / 100.0 FROM table_name
 
 SELECT '1000.0' / 100.0 FROM table_name
 

Возвращает Ошибку:

Ошибка арифметического переполнения при преобразовании varchar в тип данных numeric.

Но что странно, так это то, что следующий код НЕ вызывает ошибки:

 SELECT '100' / 100.0 FROM table_name
 

Возвращает: 1.000000 для каждой строки.

 SELECT '999' / 100.0 FROM table_name
 

Возвращает: 9.990000 для каждой строки.

 SELECT '100.0' / 100.0 FROM table_name
 

Возвращает: 1.000000 для каждой строки.

 SELECT '1000' / 100 FROM table_name
 

Возвращает: 10 для каждой строки.

С тех пор я исправил код так, чтобы он использовал преобразование, прежде чем пытаться выполнять арифметику, но что меня беспокоит, так это то, ПОЧЕМУ код работал без преобразования чисел меньше 1000???? Это действительно не дает мне покоя!

Комментарии:

1. Это происходит из-за тайных правил о масштабе и точности, присвоенных числовым константам. Настоящая мораль заключается в том, чтобы не выполнять арифметику со строками.

Ответ №1:

У вас есть 2 значения здесь:

  1. '1000' что является varchar(4)
  2. 100.0 что является decimal(4,1)

В результате при выполнении выражения '1000' / 100.0 varchar a неявно приводится к a decimal , так как decimal имеет более высокий приоритет типа данных. Однако, поскольку самое большое значение decimal(4,1) , которое может быть сохранено 999.9 , затем значение 1000 переполняется, и вы получаете сообщение об ошибке.

Комментарии:

1. В этом есть смысл. Но это поднимает еще несколько вопросов. 1. Если он преобразует строку в a decimal(4,1) , то почему в сообщении об ошибке указывается преобразование в numeric ? 2. Если он был преобразован в a decimal(4,1) , то почему '999'/100.0 возвращает значение 9.990000? не должно ли это также вызвать арифметическое переполнение?

2. numeric и decimal являются синонимами @Alexw .

3. И нет, 999 достаточно «мал», чтобы поместиться в a decimal(4,1) , так что преобразование прошло успешно.

While developing data processes in SQL Server, under certain circumstances, you might get the error message: error converting varchar to numeric. This error is similar with the conversion error you might get when you are trying to convert a varchar to float, etc.

Read on to find out the reason for getting this error message and how you can easily resolve it within just a minute.

The Numeric Data Type in SQL Server

Prior to discuss how you can reproduce and resolve the issue, it is important that you first understand the numeric data type in SQL Server. As described in the relevant MS Docs article, the numeric data type has fixed precision and scale, and it has equivalent functionality with the decimal data type.

Arguments

The numeric data type takes two arguments, that is precision and scale. The syntax is numeric(precision, scale).

Precision defines the maximum number of decimal digits (in both sides of the number) and its value range is between 1 and 38.

Scale, defines the number of decimal digit that will be stored to the right of the decimal point. Its value can range between 1 and the value specified for precision.

Here’s an example of a numeric data type value in SQL Server:

DECLARE @numValue NUMERIC(10,2);
SET @numValue=123456.7890

SELECT @numValue as NumValue;
GO

The number returned by the above T-SQL query is: 123456.7890

In the above example I specified as precision 10 and as scale 2.

So, even though I specified 123456.7890 as the numeric value, it was indirectly converted to a numeric(10,2) value and that’s why it returned the value 123456.79


Learn more tips like this! Enroll to our Online Course!

Check our online course titled “Essential SQL Server Development Tips for SQL Developers
(special limited-time discount included in link).

Sharpen your SQL Server database programming skills via a large set of tips on T-SQL and database development techniques. The course, among other, features over than 30 live demonstrations!

Essential SQL Server Development Tips for SQL Developers - Online Course

(Lifetime Access/ Live Demos / Downloadable Resources and more!)

Enroll from $12.99


Reproducing the Conversion Error

Great. Now, let’s reproduce the conversion error by trying to convert a “problematic” varchar value to numeric.

You can find this example below:

DECLARE @valueToConvert VARCHAR(50);
SET @valueToConvert='1123,456.7890';

SELECT CAST(@valueToConvert AS NUMERIC(10,2)) as ConvertedNumber;
GO

When you execute the above T-SQL code, you will get the below exact error message:

Msg 8114, Level 16, State 5, Line 4
Error converting data type varchar to numeric.

How to Resolve the Conversion Error

As you might have observed in the above example, the @valueToConvert variable, besides the dot (.), it also contains a comma (,).

Therefore, at the time of its conversion to the numeric data type, the comma is considered an illegal character for the destination data type (numeric) and that’s why you get the error message.

In order to resolve the conversion error, you just need to remove the comma (,) from the varchar value that you want to convert to numeric.

Note: At this point, you also need to make sure that the varchar value to be converted, is the actual number you wish to convert to the numeric data type. Also, you need to make sure that you only use the decimal symbol, in this case the dot (.), and not any digit grouping symbols, etc.

So, if we remove the comma from the above example, we can see that the conversion is successful.

DECLARE @valueToConvert VARCHAR(50);
SET @valueToConvert='1123456.7890';

SELECT CAST(@valueToConvert AS NUMERIC(10,2)) as ConvertedNumber;
GO

Output:

Error converting varchar to numeric in SQL Server - Article on SQLNetHub.com

In general, when converting varchar values to numbers (i.e. decimal, numeric, etc.), you need to be careful in order for your varchar value, not contain any digit grouping symbols (i.e. a comma) or any other characters that do not have a meaning as a number.

Check our Online Courses

  • SQL Server 2022: What’s New – New and Enhanced Features
  • Data Management for Beginners – Main Principles
  • Introduction to Azure Database for MySQL
  • Working with Python on Windows and SQL Server Databases
  • Boost SQL Server Database Performance with In-Memory OLTP
  • Introduction to Azure SQL Database for Beginners
  • Essential SQL Server Administration Tips
  • SQL Server Fundamentals – SQL Database for Beginners
  • Essential SQL Server Development Tips for SQL Developers
  • Introduction to Computer Programming for Beginners
  • .NET Programming for Beginners – Windows Forms with C#
  • SQL Server 2019: What’s New – New and Enhanced Features
  • Entity Framework: Getting Started – Complete Beginners Guide
  • A Guide on How to Start and Monetize a Successful Blog
  • Data Management for Beginners – Main Principles

Read Also

Feel free to check our other relevant articles on SQL Server troubleshooting:

  • Error converting data type varchar to float
  • Rule “Setup account privileges” failed – How to Resolve
  • SQL Server 2022: What’s New – New and Enhanced Features (Course Preview)
  • SQLServerAgent could not be started (reason: Unable to connect to server ‘(local)’; SQLServerAgent cannot start)
  • ORDER BY items must appear in the select list if SELECT DISTINCT is specified
  • There is no SQL Server Failover Cluster Available to Join
  • There is insufficient system memory in resource pool ‘internal’ to run this query.
  • There is not enough space on the disk. (mscorlib)
  • A network-related or instance-specific error occurred while establishing a connection to SQL Server
  • Introduction to Azure Database for MySQL (Course Preview)
  • [Resolved] Operand type clash: int is incompatible with uniqueidentifier
  • The OLE DB provider “Microsoft.ACE.OLEDB.12.0” has not been registered – How to Resolve it
  • SQL Server replication requires the actual server name to make a connection to the server – How to Resolve it
  • Issue Adding Node to a SQL Server Failover Cluster – Greyed Out Service Account – How to Resolve
  • Resolve SQL Server CTE Error – Incorrect syntax near ‘)’.
  • SQL Server is Terminating Because of Fatal Exception 80000003 – How to Troubleshoot
  • An existing History Table cannot be specified with LEDGER=ON – How to Resolve
  • Advanced SQL Server Features and Techniques for Experienced DBAs
  • SQL Server Database Backup and Recovery Guide
  • … all SQL Server troubleshooting articles

Featured Database Productivity Tools

Snippets Generator: Create and modify T-SQL snippets for use in SQL Management Studio, fast, easy and efficiently.

Snippets Generator - SQL Snippets Creation Tool

Learn more

Dynamic SQL Generator: Convert static T-SQL code to dynamic and vice versa, easily and fast.

Dynamic SQL Generator: Easily convert static SQL Server T-SQL scripts to dynamic and vice versa.

Learn more

Subscribe to our newsletter and stay up to date!

Check out our latest software releases!

Check our eBooks!

Rate this article: 1 Star2 Stars3 Stars4 Stars5 Stars (3 votes, average: 4.33 out of 5)

Loading…

Reference: SQLNetHub.com (https://www.sqlnethub.com)

© SQLNetHub


How to resolve the error: Error converting varchar to numeric in SQL Server

Click to Tweet

Artemakis Artemiou

Artemakis Artemiou is a Senior SQL Server Architect, Author, a 9 Times Microsoft Data Platform MVP (2009-2018). He has over 20 years of experience in the IT industry in various roles. Artemakis is the founder of SQLNetHub and {essentialDevTips.com}. Artemakis is the creator of the well-known software tools Snippets Generator and DBA Security Advisor. Also, he is the author of many eBooks on SQL Server. Artemakis currently serves as the President of the Cyprus .NET User Group (CDNUG) and the International .NET Association Country Leader for Cyprus (INETA). Moreover, Artemakis teaches on Udemy, you can check his courses here.

Views: 20,337

SQL Server 2012 and Later

Just use Try_Convert instead:

TRY_CONVERT takes the value passed to it and tries to convert it to the specified data_type. If the cast succeeds, TRY_CONVERT returns the value as the specified data_type; if an error occurs, null is returned. However if you request a conversion that is explicitly not permitted, then TRY_CONVERT fails with an error.

Read more about Try_Convert.

SQL Server 2008 and Earlier

The traditional way of handling this is by guarding every expression with a case statement so that no matter when it is evaluated, it will not create an error, even if it logically seems that the CASE statement should not be needed. Something like this:

SELECT
   Account_Code =
      Convert(
         bigint, -- only gives up to 18 digits, so use decimal(20, 0) if you must
         CASE
         WHEN X.Account_Code LIKE '%[^0-9]%' THEN NULL
         ELSE X.Account_Code
         END
      ),
   A.Descr
FROM dbo.Account A
WHERE
   Convert(
      bigint,
      CASE
      WHEN X.Account_Code LIKE '%[^0-9]%' THEN NULL
      ELSE X.Account_Code
      END
   ) BETWEEN 503100 AND 503205

However, I like using strategies such as this with SQL Server 2005 and up:

SELECT
   Account_Code = Convert(bigint, X.Account_Code),
   A.Descr
FROM
   dbo.Account A
   OUTER APPLY (
      SELECT A.Account_Code WHERE A.Account_Code NOT LIKE '%[^0-9]%'
   ) X
WHERE
   Convert(bigint, X.Account_Code) BETWEEN 503100 AND 503205

What this does is strategically switch the Account_Code values to NULL inside of the X table when they are not numeric. I initially used CROSS APPLY but as Mikael Eriksson so aptly pointed out, this resulted in the same error because the query parser ran into the exact same problem of optimizing away my attempt to force the expression order (predicate pushdown defeated it). By switching to OUTER APPLY it changed the actual meaning of the operation so that X.Account_Code could contain NULL values within the outer query, thus requiring proper evaluation order.

You may be interested to read Erland Sommarskog’s Microsoft Connect request about this evaluation order issue. He in fact calls it a bug.

There are additional issues here but I can’t address them now.

P.S. I had a brainstorm today. An alternate to the «traditional way» that I suggested is a SELECT expression with an outer reference, which also works in SQL Server 2000. (I’ve noticed that since learning CROSS/OUTER APPLY I’ve improved my query capability with older SQL Server versions, too—as I am getting more versatile with the «outer reference» capabilities of SELECT, ON, and WHERE clauses!)

SELECT
   Account_Code =
      Convert(
         bigint,
         (SELECT A.AccountCode WHERE A.Account_Code NOT LIKE '%[^0-9]%')
      ),
   A.Descr
FROM dbo.Account A
WHERE
   Convert(
      bigint,
      (SELECT A.AccountCode WHERE A.Account_Code NOT LIKE '%[^0-9]%')
   ) BETWEEN 503100 AND 503205

It’s a lot shorter than the CASE statement.

  • Remove From My Forums
  • Question

  • Good Afternoon,

    I’m trying to convert a field of datatype varchar to numeric and its failing with the following error

    Error converting data type varchar to numeric. Please see the sql am using and the sample data.Please need help!

    SELECT CASE 
           Isnumeric( 
          accela_staging.dbo.fact_highweedsandgrassdetails.vendorinvoiceamount) 
          WHEN 1 THEN Convert(numeric(6,2), dbo.fact_highweedsandgrassdetails.vendorinvoiceamount)
             --CAST(fact_highweedsandgrassdetails.vendorinvoiceamount AS NUMERIC(9,2)) 
         END                                                        AS 
           Total_Dollar_Amount
    VendorInvoiceAmount
    p
    97.50
    84.00
    65.00
    55.00
    420.00
    350.00
    325.00
    325.00
    240.00
    185.00
    182.00
    175.00
    150.00
    150.00
    140.00
    140.00
    135.00
    130.00
    130.00
    125.00
    120.00
    115.00
    104.00
    100.00
    10.00
    0.00
    -65.00
    -65.00
    -55.00
    -55.00
    -50.00
    0.00
    NULL

    SV

Answers

  • Thanks Visakh16, from the link i created a function and executed the sql. Please see the below query and result set. Its showing validty 0 for ‘p’ and ‘NULL’. I can ask the users to correct the «P» record, but «NULL» are valid i cant
    filter them. What is the workaround for that?

    select distinct k.VendorInvoiceAmount,k.valid
    from
    (select CaseNumber,VendorInvoiceAmount, dbo.is_numeric(VendorInvoiceAmount)as valid 
    from dbo.FACT_HighWeedsAndGrassDetails
    )k
    VendorInvoiceAmount	valid
    125.00	1
    240	1
    185.00	1
    -55	1
    130.00	1
    104.00	1
    0	1
    .	1
    100	1
    150.00	1
    p	0
    55	1
    140	1
    130	1
    140.00	1
    -65	1
    182.00	1
    -55.00	1
    NULL	0
    65	1
    84.00	1
    100.00	1
    325	1
    175.00	1
    -0	1
    10	1
    350	1
    97.50	1
    -50	1
    150	1
    120	1
    135.00	1
    115	1
    420.00	1
    -65.00	1
    325.00	1

    SV

    Nope thats not true

    NULL represents an unknown value so you wont be able to determine a data type for it

    Hence validation functions like ISNUMERIC,ISDATE etc should always return false for it

    see this

    SELECT ISNUMERIC(NULL),ISDATE(NULL)

    So the function is working as per design

    if you want to include them too you need to write condition as this

    select distinct k.VendorInvoiceAmount,k.valid
    from
    (select CaseNumber,VendorInvoiceAmount, dbo.is_numeric(VendorInvoiceAmount)as valid 
    from dbo.FACT_HighWeedsAndGrassDetails
    )k
    WHERE valid = 1
    OR VendorInvoiceAmount IS NULL

    Please Mark This As Answer if it solved your issue
    Please Mark This As Helpful if it helps to solve your issue
    Visakh
    —————————-
    My MSDN Page
    My Personal Blog
    My Facebook Page

    • Marked as answer by

      Tuesday, October 28, 2014 3:06 PM

  • case when value NOT
    LIKE ‘%[^0-9]%’ THEN CAST(value
    as numeric(6,2))
    ELSE NULL END

    The values contain ‘.’ which is not 0-9. So no, it should not solve your problem, unless the values are not decimal.

    • Marked as answer by
      saivenkat77
      Tuesday, October 28, 2014 3:05 PM

If you’re getting SQL Server error Msg 8114 that reads something like Error converting data type varchar to numeric, it’s probably because you’re trying to perform a data type conversion that fails due to the value not being able to be converted to the destination type.

It’s not because you can’t convert that type to the new type. It’s because of the value itself.

Example of Error

Here’s an example of code that produces the error:

SELECT CAST('Ten' AS DECIMAL(5,2));

Result:

Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.

This error occurred because SQL Server couldn’t convert the string value to decimal.

Solution 1

To fix this, you’d need to make sure you provide a value that SQL Server can convert.

If you’re passing a column, check that you’ve got the right column. Same if you’re passing a variable – check that it’s the right variable.

Bear in mind that this might not happen in all cases of trying to convert a string to decimal, because some string values can be converted.

For example, the following conversion succeeds:

SELECT CAST('10' AS DECIMAL(5,2));

Result:

10.00

Here, SQL Server was able to work out that 10 is a number, and therefore the conversion succeeded.

Solution 2

If you don’t mind the conversion failing, but you just don’t want it to return an error, try the TRY_CAST() or TRY_CONVERT() functions.

Rather than return an error, these functions return NULL when the value can’t be converted.

Example:

SELECT TRY_CAST('Ten' AS DECIMAL(5,2));

Result:

NULL

I keep getting this error and I dont understand why. I checked all CONVERT functions but not sure where is the issue.

Msg 8114, Level 16, State 5, Line 1
Error converting data type varchar to numeric.

This is the query and you can see Line 1 does not have any type of conversion.

SELECT 
  'Entity Code|Department Code|Job Code|Pay Code|Pay Period Code|Employee Code|Fiscal Year|Time 
  Class|Unit Type|Amount|Home Entity Code|Home Department|Pay Period End Date' AS PRL_HEADERR
UNION ALL SELECT       
  (ISNULL(RTRIM(LTRIM(RIGHT(REPLICATE(0, 4) + SUB.DIST_COMPANY, 4))), '')    
  + '|' + ISNULL(RTRIM(LTRIM(RIGHT(REPLICATE(0, 4) + SUB.DST_ACCT_UNIT2, 4))), '')   
  + '|' + ISNULL((SUB.JOB_CODE2), '')                      
  + '|' + ISNULL((SUB.PAY_CODE2), '')                      
  + '|' + ISNULL((SUB2.PAYPERIOD), '')                     
  + '|' + ISNULL(
      (CASE WHEN SUBSTRING(RIGHT(REPLICATE(0, 7) + SUB.EMPLOYEE, 7),1,1)='0' 
      THEN SUBSTRING(RIGHT(REPLICATE(0, 7) + SUB.EMPLOYEE, 7),2,LEN(RIGHT(REPLICATE(0, 7) + 
      SUB.EMPLOYEE, 7))) 
      ELSE RIGHT(REPLICATE(0, 7) + SUB.EMPLOYEE, 7) END), '')    
  + '|' +       ISNULL((SUB.FISCAL_YEAR), '')                    
  + '|' +       ISNULL((SUB.TIME_CLASS), '')                     
  + '|' +       ISNULL((SUB.UNIT_TYPE), '')                      
  + '|' +       ISNULL((SUB.UNIT_VALUE), '')                     
  + '|' +       ISNULL(HOME_ENTITY_CODE, '')                     
  + '|' +       ISNULL(HOME_DEPARTMENT, '')                     
  + '|' +     ISNULL(PAY_PER_END_DATE, ''))  AS PRL_HEADER
FROM
 (
  SELECT
     TOP 100 PERCENT DIST_COMPANY,
     LTRIM(RTRIM(DST_ACCT_UNIT)) AS DST_ACCT_UNIT2,
     LTRIM(RTRIM(JOB_CODE)) AS JOB_CODE2,
     LTRIM(RTRIM(PAY_CODE)) AS PAY_CODE2,
     PER_END_DATE,
     EMPLOYEE,
     (CONVERT(VARCHAR(4), GL_DATE, 112)) AS FISCAL_YEAR,
     'A' AS TIME_CLASS,
     'Hours' AS UNIT_TYPE,
     HOURS AS UNIT_VALUE,
     COMPANY AS HOME_ENTITY_CODE,
     LTRIM(RTRIM(HM_ACCT_UNIT)) AS HOME_DEPARTMENT,
     CONVERT(VARCHAR(8), PER_END_DATE,112) AS PAY_PER_END_DATE 
  FROM
     TEST_TABLE
  WHERE
     (
        GL_DATE >= CAST('20200101' AS DATETIME)
        AND GL_DATE <= CAST('20201231' AS DATETIME)
     )
  UNION ALL
  SELECT TOP 1000
     DIST_COMPANY,
     LTRIM(RTRIM(DST_ACCT_UNIT)) AS DST_ACCT_UNIT2,
     LTRIM(RTRIM(JOB_CODE)) AS JOB_CODE2,
     LTRIM(RTRIM(PAY_CODE)) AS PAY_CODE2,
     PER_END_DATE,
     EMPLOYEE,
     (CONVERT(VARCHAR(4), GL_DATE, 112)) AS FISCAL_YEAR,
     'A' AS TIME_CLASS,
     'Amount' AS UNIT_TYPE,
     WAGE_AMOUNT AS UNIT_VALUE,
     COMPANY AS HOME_ENTITY_CODE,
     LTRIM(RTRIM(HM_ACCT_UNIT)) AS HOME_DEPARTMENT,
     CONVERT(VARCHAR(8), PER_END_DATE,112) AS PAY_PER_END_DATE 
  FROM
     TEST_TABLE
  WHERE
     (
        GL_DATE >= CAST('20200101' AS DATETIME)
        AND GL_DATE <= CAST('20201231' AS DATETIME)
     )
  ORDER BY
     EMPLOYEE,
     PER_END_DATE 
 )
 AS SUB 
 INNER JOIN
  (
     SELECT
        ROW_NUMBER() OVER (ORDER BY PP_END_DATE) AS ROWNUM,
        SUB3.PP_END_DATE,
        (
           (CONVERT(VARCHAR(4), SUB3.PP_END_DATE, 112) + '-') + ROWNUM
        )
        AS PAYPERIOD
     FROM
        (
           SELECT DISTINCT
              TOP 100 PERCENT PER_END_DATE AS PP_END_DATE 
           FROM
              TEST_TABLE
           WHERE
              (
                 PER_END_DATE >= CAST('20200101' AS DATETIME)
                 AND PER_END_DATE <= CAST('20201231' AS DATETIME) 
              )
           ORDER BY
              PER_END_DATE 
        )
        AS SUB3 
  )
  AS SUB2 
  ON SUB2.PP_END_DATE = SUB.PER_END_DATE

This query was written in Oracle by someone else and I’m converting it to MS SQL. Also the app is large and legacy, written in Cobol. Good thing is there is not a lot of data here therefore performance is not a big concern.

  • Remove From My Forums
  • Question

  • Hello,

    I am trying to JOIN two tables in a query. The tables and fields are:

    dartr.art_no CHAR(35)
    doliner.art_no VARCHAR(15)

    I try the following JOIN:

    LEFT
    OUTER
    JOIN dartr
    ON
    CONVERT(char(35),doliner.art_no)
    = dartr.art_no

    I get the follwong error message:

    «Error converting data type varchar to numeric»

    What would the correct conversion look like, please?

    Thanks in advance!
    Martin

Answers

  • Why do you need a WHERE condition if you already JOINED these tables? The WHERE condition will essentially do the same as JOIN, but it will turn your query into an INNER JOIN. Also, you’re still not specifying the precision with NUMERIC.


    Premature optimization is the root of all evil in programming. (c) by Donald Knuth

    Naomi Nosonovsky, Sr. Programmer-Analyst

    My blog

    • Marked as answer by

      Tuesday, February 1, 2011 11:07 AM

hello friends…

i have following query.

declare @month int
declare @year int
set @month=8
set @year =2014

declare @startdate datetime
declare @enddate datetime
set @startdate=CONVERT(datetime,convert(varchar,@year)+'-'+convert(varchar,@month)+'-'+'01')

if (@month>= MONTH(GETDATE()) and @year>=YEAR(GETDATE()))
begin
	set @enddate=(select GETDATE()) 
end
else
begin
	set @enddate=DATEADD(day,-1,DATEADD(month,1,@startdate))
end

create table #suspended_alumina_gpl
(
	edate datetime,
	avgliq decimal(18,5)
)

while (@startdate<=@enddate)
begin
	
	insert into #suspended_alumina_gpl 
	select convert(datetime,@startdate),isnull(AVG(spent_liquor),'') from suspended_alumina_gpl
	where CONVERT(varchar,edatetime,103)=CONVERT(varchar,@startdate)
		
	set @startdate=DATEADD(day,1,@startdate)
end
select * from #suspended_alumina_gpl

but it throws an error as follows while executing it.

Msg 8114, Level 16, State 5, Line 29
Error converting data type varchar to numeric.

54 / 6 / 5

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

Сообщений: 171

1

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


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

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

0

Igr_ok

783 / 615 / 272

Регистрация: 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,357

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

1489 / 986 / 219

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

Сообщений: 3,244

Записей в блоге: 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

783 / 615 / 272

Регистрация: 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

1489 / 986 / 219

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

Сообщений: 3,244

Записей в блоге: 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,357

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

1489 / 986 / 219

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

Сообщений: 3,244

Записей в блоге: 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

783 / 615 / 272

Регистрация: 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,357

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,357

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,357

26.02.2021, 13:05

20

Скобки уберите вокруг ProductID.Text:

C#
1
  myCommand.Parameters.AddWithValue("@product", (int)ProductID.Text);

0

#sql #sql-server #tsql

Вопрос:

Я обнаружил странную проблему в своей базе данных, я смог ее исправить, но я не понимаю, ПОЧЕМУ эта ошибка возникла в первую очередь. Я использую Microsoft SQL Server 2017.

Следующий код возвращает ошибку арифметического переполнения:

 SELECT '1000' / 100.0 FROM table_name
 
 SELECT '1000.0' / 100.0 FROM table_name
 

Возвращает Ошибку:

Ошибка арифметического переполнения при преобразовании varchar в тип данных numeric.

Но что странно, так это то, что следующий код НЕ вызывает ошибки:

 SELECT '100' / 100.0 FROM table_name
 

Возвращает: 1.000000 для каждой строки.

 SELECT '999' / 100.0 FROM table_name
 

Возвращает: 9.990000 для каждой строки.

 SELECT '100.0' / 100.0 FROM table_name
 

Возвращает: 1.000000 для каждой строки.

 SELECT '1000' / 100 FROM table_name
 

Возвращает: 10 для каждой строки.

С тех пор я исправил код так, чтобы он использовал преобразование, прежде чем пытаться выполнять арифметику, но что меня беспокоит, так это то, ПОЧЕМУ код работал без преобразования чисел меньше 1000???? Это действительно не дает мне покоя!

Комментарии:

1. Это происходит из-за тайных правил о масштабе и точности, присвоенных числовым константам. Настоящая мораль заключается в том, чтобы не выполнять арифметику со строками.

Ответ №1:

У вас есть 2 значения здесь:

  1. '1000' что является varchar(4)
  2. 100.0 что является decimal(4,1)

В результате при выполнении выражения '1000' / 100.0 varchar a неявно приводится к a decimal , так как decimal имеет более высокий приоритет типа данных. Однако, поскольку самое большое значение decimal(4,1) , которое может быть сохранено 999.9 , затем значение 1000 переполняется, и вы получаете сообщение об ошибке.

Комментарии:

1. В этом есть смысл. Но это поднимает еще несколько вопросов. 1. Если он преобразует строку в a decimal(4,1) , то почему в сообщении об ошибке указывается преобразование в numeric ? 2. Если он был преобразован в a decimal(4,1) , то почему '999'/100.0 возвращает значение 9.990000? не должно ли это также вызвать арифметическое переполнение?

2. numeric и decimal являются синонимами @Alexw .

3. И нет, 999 достаточно «мал», чтобы поместиться в a decimal(4,1) , так что преобразование прошло успешно.

  • Ошибка арифметического переполнения при преобразовании numeric к типу данных numeric sql
  • Ошибка арифметического переполнения при преобразовании int к типу данных numeric
  • Ошибка аср фольксваген гольф
  • Ошибка аср мерседес w210
  • Ошибка асп на кассе миника