SQL CAST causes Arithmetic Overflow Error even when row is NOT in result set

arithmetic overflow error converting expression to data type nvarchar.
arithmetic overflow error converting numeric to data type numeric.
arithmetic overflow error converting expression to data type int the statement has been terminated
how to solve arithmetic overflow error in sql
arithmetic overflow error converting numeric to data type varchar
arithmetic overflow error converting nvarchar to data type numeric.
arithmetic overflow error converting identity to data type int
arithmetic overflow error converting expression to data type tinyint

This one has us perplexed ...

We have a query that uses CAST to convert a float to a decimal, this query joins a number of tables to find the rows to return. One of the rows in one of the tables contains a value that when CAST to a decimal causes an Arithmetic Overflow Error.

The strange thing is that the row that has this value is NOT one of the rows that is being returned in the result set.

Overly simplified example:

ID  Value
1   1.1
2   11.1
3   11111.1

Query:

SELECT Id, CAST(value as decimal(4,1))
FROM <complex number of joins>
WHERE <conditions that don't return row with Id 3>

... Arithmetic Error

If we explicitly exclude that row in the WHERE clause then the error goes away. Eg. WHERE ... AND Id <> 3

.. Works fine

Does anyone know how this is possible?

NOTE: The issue here is not that the CAST fails on row with Id 3! The issue is that the WHERE clause excludes the row with Id 3, and yet the query still fails. How can the query fail if the row with value 11111.1 is not being returned by the WHERE clause?

The type DECIMAL(4, 1) means a total of four places of precision, one of which is to the right of the decimal place. So, to accommodate the value 11111.1, you would need at least DECIMAL(6, 1). The following query should work:

SELECT Id, CAST(value AS DECIMAL(6,1))
FROM <complex number of joins>
WHERE <conditions that don't return row with Id 3>

At least, the above would work for the three points of sample data you provided.

Demo

SELECT AVG() causing arithmetic overflow? – SQLServerCentral, Arithmetic overflow error converting expression to data type int. row table with values on the higher end of the int spectrum (or even the SQL defines a location and datatype for that target prior to the start of the it's slower) if it upconverts everything to BIGINT when it does not need to. Set @Acc = 0. The strange thing is that the row that has this value is NOT one of the rows that is being returned in the result set. Overly simplified example: ID Value 1 1.1 2 11.1 3 11111.1

It seems that the filter is being applied after the operation, not the other way around. Take a look at the execution plan for your query to help you understand the order of operations.

Find the Bad Row: Arithmetic overflow error converting real to data , Now, with only 5 rows, we can see where the results stop, and know that If you are not on SQL 2012,, probably the best way is to check the� In particular what is happening to you is you are doing a SUM on an 18,2 value. SQL knows the result will have two digits to the right of the decimal. But it does not know how big the result will be. So it puts the result in the largest numeric type with two decimal places. That is numeric(38,2). So, for example, suppose the sum is 1234.56.

it is not because of your where condition which filters data, but it is because you have chosen less data length in cast. You should change it to DECIMAL(8,2) or maximum length of your column data is there. You can try following example which will explain you how it works.

Following will work as it doesn't fetch any data

WITH yourTable AS (
    SELECT 1 AS ID, '1.1' AS Value UNION ALL
    SELECT 2, '11.1' UNION ALL
    SELECT 3, '11111.1313'
)

SELECT Id, CAST(value as decimal(4,1)) AS Id_casted
FROM yourTable WHERE yourTable.ID=4

Following won't work as decimal value exceed than conversion length

WITH yourTable AS (
    SELECT 1 AS ID, '1.1' AS Value UNION ALL
    SELECT 2, '11.1' UNION ALL
    SELECT 3, '11111.1313'
)

SELECT Id, CAST(value as decimal(4,1)) AS Id_casted
FROM yourTable WHERE yourTable.ID=3

You can solve this by changing Decimal(4,1) = 3 digit to Decimal(8,2) = 6 digit

WITH yourTable AS (
    SELECT 1 AS ID, '1.1' AS Value UNION ALL
    SELECT 2, '11.1' UNION ALL
    SELECT 3, '11111.1313'
)

SELECT Id, CAST(value as DECIMAL(8,2)) AS Id_casted
FROM yourTable WHERE yourTable.ID=3

Simply following code shows it throws exception as max value will be 999.99 for numeric(5,2) and when you assign 1000 it will throw exception

DECLARE @aritherror NUMERIC(5,2)
SET @aritherror = 1000.554
SELECT @aritherror

SUM, AVG, and arithmetic overflow, Arithmetic overflow error converting expression to data type int. Heck, we even need to use it in indexed views when they perform an aggregation. and there's not a solution out there that doesn't require changing code. Add cultures similar to CONVERT to indicate int, bigint, or decimal; Change the� Pinal Dave is a SQL Server Performance Tuning Expert and an independent consultant. He has authored 12 SQL Server database books, 33 Pluralsight courses and has written over 5100 articles on the database technology on his blog at a https://blog.sqlauthority.com. Along with 17+ years of hands-on experience, he holds a Masters of Science degree and a number of database certifications.

what is causing arithmetic overflow in the query below?, STR formats the result and does not raise an error on overflow; It does not cause the error in the question to be thrown. A dynamic SQL version (to� ONLY display certain rows from an inner joined table using a certain colum as a parameter from one of the inner joined tables. sql-server,join. If I understood correctly this should be what you're looking for SELECT A.UserName, A.[Email ID], A.[Supervisor Email ID] FROM A INNER JOIN B ON A.UserCode = B.UserCode WHERE B.ACTIVE_FLAG = 'Y'

How to solve Arithmetic overflow error converting IDENTITY to data , The reason was dreaded "Arithmetic overflow error converting IDENTITY to data type int" Btw, if you are not familiar with the range of basic data types in SQL Server, is causing problem has an int data type, but there are only 1 billion rows there, but Having similar value may result in duplicate Ids in some other system. A) They are only thinking of the end result and forget that the overflow happens while still accumulating and not at the end when it returns. or, .. B) They assume that some kind of "rolling

Casting issue with MS SQL Server � Issue #937 � dimitri/pgloader , SQL Error (8115): Arithmetic overflow error converting bigint to data type numeric. Unfortunately pgloader isn't even reporting an error, it seems to swallow it and move on. So the issue is a negative bigint at max cause this to fail. will force using numeric(20) as the query result-set for all bigint values,� How to create a SQL Server Create table with a simple query? This basic SQL example creates a table to store Sales data. It is using different data types, such as strings, numeric values, decimal values, integers and boolean.

Comments
  • Please provide the execution plan. I have seen that sometime plan evaluates a row even if it won't be returned after all steps are executed. If it CAST on that row it will error even if the row is supposed to be filtered out.
  • @Salim In the table involved there may be a column value which can not be converted to the specified cast as in the query.
  • Yes there is a value but why is it being cast when it is not in the resulset? Any doco that explain this?
  • @Jack, what is the data type of each of the columns before casting to decimal? In this particular case, what is the data type of the table in question?
  • Id is int, Value is float.
  • Please read the question again. You have not grasped the issue.
  • @Jack No, I think I grasp your question correctly. You should check the demo link I included in my answer, which is now working. Change the precision back to DECIMAL(4,1) to see it start failing again.
  • The issue is that the query fails even though the resultset doesn't include the row with Id 3. Since row 3 is not in the result set, it shouldn't be casting 11111.1 ... this has something to do with the way SQL creates query plans.
  • Not likely. My first guess is your WHERE clause is still including some other value which can't fit in DECIMAL(4,1). Did you think to check for that?
  • Yep, and there isn't. There is only one value in one field in one row in that table that cannot be cast to dec(4,1) and the where clause excludes that row.
  • The table with the value that cannot be cast is the table from the complex join being evaluated first in the query plan. Still doesn't answer why it would do the cast at that point. Seems counter intuitive.
  • The filtering out of unwanted computed results could be the last step before delivery of desired results.
  • can you elaborate? I think you mean that the CAST should have been the last step - which is my understanding also, yet the evidence suggests it is done earlier.
  • Please read question again. You have misunderstood the true issue here.