Меню

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

I’m getting this error

msg 8115, level 16, state 2, line 18
Arithmetic overflow error converting expression to data type int.

with this SQL query

DECLARE @year VARCHAR(4);                       
DECLARE @month VARCHAR(2);                      

-- START OF CONFIGURATION SECTION                       
-- THIS IS THE ONLY SECTION THAT SHOULD BE MODIFIED                     
-- SET THE YEAR AND MONTH PARAMETERS                        

SET @year = '2013';                     
SET @month = '3';  -- 1 = January.... 12 = Decemeber.                       

-- END OF CONFIGURATION SECTION                     

DECLARE @startDate DATE                     
DECLARE @endDate DATE                       
SET @startDate = @year + '-' + @month + '-01 00:00:00';                     
SET @endDate = DATEADD(MONTH, 1, @startDate);                       

SELECT                          
    DATEPART(YEAR, dateTimeStamp) AS [Year]                         
    , DATEPART(MONTH, dateTimeStamp) AS [Month]                         
    , COUNT(*) AS NumStreams                        
    , [platform] AS [Platform]                      
    , deliverableName AS [Deliverable Name]                     
    , SUM(billableDuration) AS NumSecondsDelivered                      
FROM                            
    DeliveryTransactions                        
WHERE                           
    dateTimeStamp >= @startDate                     
AND dateTimeStamp < @endDate                        
GROUP BY                            
    DATEPART(YEAR, dateTimeStamp)                       
    , DATEPART(MONTH, dateTimeStamp)                        
    , [platform]                        
    , deliverableName                       
ORDER BY                            
    [platform]                      
    , DATEPART(YEAR, dateTimeStamp)                         
    , DATEPART(MONTH, dateTimeStamp)                        
    , deliverableName   

SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard Еще…Меньше

Проблемы

Рассмотрим следующий сценарий.

  • Вы создаете связанный сервер для Microsoft SQL Server 2012.

  • При попытке выполнить инструкцию SQL, вызывающую системную хранимую процедуру sys.sp_tables_info_90_rowset_64 , чтобы получить доступ к таблице из экземпляра SQL Server 2012 по умолчанию.

  • Таблица содержит более 2 500 000 000 записей.

В этом случае появляется следующее сообщение об ошибке:

Сообщение 8115, уровень 16, состояние 2, sp_tables_info_90_rowset_64 процедуры, строка 9Arithmetic ошибка переполнения при преобразовании выражения в тип данных int.

Примечание.Эта проблема возникает при настройке SQL Server 2012 в качестве целевого сервера.

Решение

Сведения о накопительном пакете обновления

Накопительный пакет обновления 1 (SP1) для SQL Server 2012 с пакетом обновления 1 (SP1)

Исправление для этой проблемы впервые выпущено в накопительном обновлении 1. За дополнительными сведениями о том, как получить этот накопительный пакет обновления для SQL Server 2012 с пакетом обновления 1 (SP1), щелкните следующий номер статьи базы знаний Майкрософт:

2765331 Накопительный пакет обновления 1 (SP1) для SQL Server 2012 с пакетом обновления 1 (SP1)Примечание. Так как сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2012. Рекомендуется установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:

2772858 Сборки SQL Server 2012, выпущенные после выпуска пакета обновления 1 (SP1) для SQL Server 2012

SQL Server 2012

Исправление для этой проблемы впервые выпущено в накопительном обновлении 4. Для получения дополнительных сведений о том, как получить этот накопительный пакет обновления для SQL Server 2012, щелкните следующий номер статьи базы знаний Майкрософт:

2758687 Накопительный пакет обновления 4 для SQL Server 2012Примечание. Так как сборки являются кумулятивными, каждый новый выпуск исправлений содержит все исправления и все исправления безопасности, которые были включены в предыдущий выпуск исправлений для SQL Server 2012. Рекомендуется установить последнюю версию исправления, которая включает это исправление. Дополнительные сведения см. в следующей статье базы знаний Майкрософт:

2692828 Сборки SQL Server 2012, выпущенные после выпуска SQL Server 2012

Статус

Корпорация Майкрософт подтверждает наличие этой проблемы в своих продуктах, которые перечислены в разделе «Применяется к».

Дополнительная информация

Дополнительные сведения о том, как настроить связанные серверы в SQL Server 2012, можно найти на веб-сайте MSDN по следующему адресу:

Настройка связанных серверов в SQL Server 2012

Нужна дополнительная помощь?

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.

When I run this command with SUM()

SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

I’m getting,

Arithmetic overflow error converting expression to data type int.

Any idea on what is the cause of it?

I’m just following the instructions in this answer.

asked May 23, 2017 at 16:55

Evan Carroll's user avatar

Evan CarrollEvan Carroll

58.9k42 gold badges216 silver badges442 bronze badges

For values larger than the INT max (2,147,483,647), you’ll want to use COUNT_BIG(*).

SELECT COUNT_BIG(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

If it’s happening in the SUM, you need to convert Amount to a BIGINT.

SELECT COUNT(*) AS [Records], SUM(CONVERT(BIGINT, t.Amount)) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

answered May 23, 2017 at 16:56

Erik Darling's user avatar

Erik DarlingErik Darling

35.5k14 gold badges124 silver badges339 bronze badges

0

When I run this command with SUM()

SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

I’m getting,

Arithmetic overflow error converting expression to data type int.

Any idea on what is the cause of it?

I’m just following the instructions in this answer.

asked May 23, 2017 at 16:55

Evan Carroll's user avatar

Evan CarrollEvan Carroll

58.9k42 gold badges216 silver badges442 bronze badges

For values larger than the INT max (2,147,483,647), you’ll want to use COUNT_BIG(*).

SELECT COUNT_BIG(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

If it’s happening in the SUM, you need to convert Amount to a BIGINT.

SELECT COUNT(*) AS [Records], SUM(CONVERT(BIGINT, t.Amount)) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;

answered May 23, 2017 at 16:56

Erik Darling's user avatar

Erik DarlingErik Darling

35.5k14 gold badges124 silver badges339 bronze badges

0

SELECT                          
    DATEPART(YEAR, dateTimeStamp) AS [Year]                         
    , DATEPART(MONTH, dateTimeStamp) AS [Month]                         
    , COUNT(*) AS NumStreams                        
    , [platform] AS [Platform]                      
    , deliverableName AS [Deliverable Name]                     
    , SUM(billableDuration) AS NumSecondsDelivered

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

Одно из ваших выражений должно быть приведено/преобразовано в int, чтобы это произошло, что является значением Arithmetic overflow error converting expression to data type int.

  • Remove From My Forums
  • Question

  • I cant seem to get past the erro «Arithmetic overflow error converting expression to data type int.«

    My code is

    CONVERT(BigInt,(SUM(CASE WHEN col1 > 100000000 THEN 1 ELSE 0 END)))/CONVERT(Bigint,(SUM(CASE WHEN col1 > 10000000 THEN 1 ELSe 0 end)))*2 As ‘LargeSpend’

    Could anyone advise please?

    Thanks

Answers

  • Hi there,

    I suggest you to use CAST instead of CONVERT. I tried this conversion with CAST and it worked successfully (see below):

    USE [tempdb]
    GO
    CREATE TABLE #MyTable (col1 bigint)
    INSERT INTO #MyTable VALUES ('10000000003')
    INSERT INTO #MyTable VALUES ('20000000004')
    INSERT INTO #MyTable VALUES ('30000000003')
    SELECT CAST((SUM(CASE WHEN col1 > 100000000 THEN 1 ELSE 0 END)) AS [bigint])
    /CAST((SUM(CASE WHEN col1 > 10000000 THEN 1 ELSe 0 end)) AS [bigint])*2 AS 'LargeSpend'
    FROM #MyTable


    Regards,

    Basit A. Farooq (MSC Computing, MCITP SQL Server 2005 & 2008, MCDBA SQL Server 2000)

    http://basitaalishan.com

    Please remember to click «Mark as Answer» on the post that helps you, and to click
    «Unmark as Answer» if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread.

    • Proposed as answer by

      Friday, August 17, 2012 1:45 PM

    • Marked as answer by
      Iric Wen
      Monday, August 27, 2012 9:16 AM

Aumi

20 / 35 / 14

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

Сообщений: 406

1

Ошибка арифметического переполнения

05.02.2018, 12:38. Показов 9839. Ответов 3

Метки нет (Все метки)


Здравствуйте,

Есть таблица1 (idtovar, price,amount,itog)

T-SQL
1
2
3
    [Price] [smallmoney] NULL,
    [Amount] [int] NULL,
itog float null

В таблице заполнены все столбцы, кроме itog.

Есть процедура, которая заполняет этот столбец

T-SQL
1
2
3
4
ALTER procedure [dbo].[UpdateSumDelta]
as
 
UPDATE tab1 SET itog = Amount*Price;

если я в таблицу добавлю одну строчку и выполню процедуру, то ошибки нет.
Но когда мне надо обновить 60 т строк, то:

Код

Сообщение 8115, уровень 16, состояние 2, процедура UpdateSumDelta, строка 43
Ошибка арифметического переполнения при преобразовании expression к типу данных smallmoney.
Выполнение данной инструкции было прервано.

Откуда взялось expression? Как бороться с ошибкой?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

05.02.2018, 12:38

3

1107 / 753 / 181

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

Сообщений: 2,241

05.02.2018, 12:49

2

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

Откуда взялось expression?

Amount*Price

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

В таблице заполнены все столбцы, кроме itog.
Есть процедура, которая заполняет этот столбец

А зачем что-то хранить, если можно просто сделать вычисляемое поле itog AS Amount*Price??
И процедура тогда не нужна.
Почему там SMALLMONEY, а не MONEY?
Использование типа FLOAT в финансовых расчётах крайне нежелательно.
Лучше MONEY или DEC(длина, точность) подходящего размера.
Хотя, если итог станет вычисляемым, его тип будет определяться выражением Amount*Price.



0



20 / 35 / 14

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

Сообщений: 406

05.02.2018, 12:51

 [ТС]

3

iap, У меня участвуют небольшие цены, поэтому взяла smallmoney.

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

Лучше MONEY или DEC(длина, точность) подходящего размера

это вместо float использовать?



0



1107 / 753 / 181

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

Сообщений: 2,241

05.02.2018, 13:00

4

Лучший ответ Сообщение было отмечено Aumi как решение

Решение

Приоритет типов данных (Transact-SQL)

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

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

iap, У меня участвуют небольшие цены, поэтому взяла smallmoney.

это вместо float использовать?

Я ж говорю, лучше не далать itog постоянным полем, а сделать вычисляемым.
Тип будет определяться из выражения (Expression) согласно приоритету типов (почитайте про это, ссылку я дал).

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

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

iap, У меня участвуют небольшие цены, поэтому взяла smallmoney.

Результат умножения будет приведён к типу сомножителя с бОльшим приритетом типа.
Если оставить SMALLMONEY и INT, то это будет SMALLMONEY, но он не вмещает в себя результат умножения.
Можно попытаться явно преобразовать тип в какой-нибудь побольше, поместив умножение в функцию CAST().



1



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

05.02.2018, 13:00

4

Главная » Основные форумы » Система QUIK

Страницы:
1

 

Leff


Пользователь

Сообщений: 63
Регистрация: 31.01.2015

#1

16.06.2015 21:48:12

 [Microsoft][SQL Server Native Client 10.0][SQL Server]Ошибка арифметического переполнения при преобразовании expression к типу данных int. SQLSTATE=22003 Код ошибки=8115 ODBC_ERROR
[Microsoft][SQL Server Native Client 10.0][SQL Server]Выполнение данной инструкции было прервано. SQLSTATE=01000 Код ошибки=3621 ODBC_ERROR

Как узнать на какое поле какой таблицы ругается?
В приложении 6,13 «Форматы данных для настройки экспорта через ODBC «
НЕТ ни одного поля типа expression! что это за поле?

PS хелп свежий. седня качал. почему ничего в нем нет про таблицу транзакций?
PSS выгружаю 48 разных таблиц, перебирать их все включая/выключая с угадыванием этого поля совсем не комильфо

 

Alexey Ivannikov


QUIK clients support

Сообщений: 1275
Регистрация: 22.12.2014

#2

16.06.2015 21:56:32

Цитата
Leff пишет:
[Microsoft][SQL Server Native Client 10.0][SQL Server]Ошибка арифметического переполнения при преобразовании expression к типу данных int. SQLSTATE=22003 Код ошибки=8115 ODBC_ERROR
[Microsoft][SQL Server Native Client 10.0][SQL Server]Выполнение данной инструкции было прервано. SQLSTATE=01000 Код ошибки=3621 ODBC_ERROR

Как узнать на какое поле какой таблицы ругается?
В приложении 6,13 «Форматы данных для настройки экспорта через ODBC «
НЕТ ни одного поля типа expression! что это за поле?

PS хелп свежий. седня качал. почему ничего в нем нет про таблицу транзакций?
PSS выгружаю 48 разных таблиц, перебирать их все включая/выключая с угадыванием этого поля совсем не комильфо

Добрый день.

Как вариант — посмотреть в логе, создав quik_odbc.log.

Как создать файл с именем quik_odbc.log:
— при закрытом Quik в его папке создайте пустой файл с именем quik_odbc.log
— запустите Quik, начните экспорт по ODBC.

 

Leff


Пользователь

Сообщений: 63
Регистрация: 31.01.2015

#3

16.06.2015 22:05:42

Цитата
Alexey Ivannikov пишет:
quik_odbc.log

спасибо за оперативность. пробую

 

Leff


Пользователь

Сообщений: 63
Регистрация: 31.01.2015

#4

16.06.2015 22:13:40

Цитата
Alexey Ivannikov пишет:
expression

сделал. пока тишина — ошибок нет.
в момент вывода этих ошибок моих сделок не было, т.е. остаются только 2 таблицы — параметров и всех сделок.
может скажите по каким полям в этих двух таблицах возможна такая ошибка?

неохота завтра нарваться в рабочем режиме  

 

Leff


Пользователь

Сообщений: 63
Регистрация: 31.01.2015

#5

16.06.2015 22:20:30

так. ошибка снова. лог куда слать? я посмотрел но ничо не понял. мало инфы в нем

 

Alexey Ivannikov


QUIK clients support

Сообщений: 1275
Регистрация: 22.12.2014

#6

16.06.2015 22:27:23

Цитата
Leff пишет:
так. ошибка снова. лог куда слать? я посмотрел но ничо не понял. мало инфы в нем

Добрый день.

quiksupport@arqatech.com

 

Leff


Пользователь

Сообщений: 63
Регистрация: 31.01.2015

#7

16.06.2015 22:28:45

Цитата
Alexey Ivannikov пишет:
quiksupport@arqatech.com

ушло

 

Leff


Пользователь

Сообщений: 63
Регистрация: 31.01.2015

#8

16.06.2015 22:42:58

ошибка вышла в 22:14:02 похоже (если верить предыдущей записи) что на таблицу всех сделок.
причем удивительно что сделок в это время не было. и какой то подозрительный разрыв 13 секунд

 

Leff


Пользователь

Сообщений: 63
Регистрация: 31.01.2015

#9

16.06.2015 22:49:32

похоже нашел. по номеру сделки перед ошибкой:

толи кол-во толи 3 милиарда не вошло.
растопырю еще значение, чтоб входило.

 

Alexey Ivannikov


QUIK clients support

Сообщений: 1275
Регистрация: 22.12.2014

#10

16.06.2015 22:54:40

Цитата
Leff пишет:

Цитата
Alexey Ivannikov пишет:
quiksupport@arqatech.com

ушло

Добрый день.

Ответили Вам на почту.

P.S. Скорее всего у Вас формат для объёма в ТВС стоит неверный.

Страницы:
1

Читают тему (гостей: 2)

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка антипробуксовочной системы фольксваген джетта 6
  • Ошибка арифметического переполнения при преобразовании expression к типу данных int mssql