Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Error converting data type varchar to numeric." - What column?

Tags:

sql-server

I have a huge INSERT-statement with 200 columns and suddendly I get the dreaded Error converting data type varchar to numeric. Is there somewhere I can see the actual column that contains the "varchar" value? I know I can remove one of the columns at a time until the error disappears, but it's very tedious.

like image 878
Espo Avatar asked Jul 01 '10 09:07

Espo


People also ask

How do I convert varchar to numeric?

To convert a varchar type to a numeric type, change the target type as numeric or BIGNUMERIC as shown in the example below: SELECT CAST('344' AS NUMERIC) AS NUMERIC; SELECT CAST('344' AS BIGNUMERIC) AS big_numeric; The queries above should return the specified value converted to numeric and big numeric.

How do I fix conversion failed when converting the varchar value to data type int?

To fix this, either convert the number to a string, or use a function like CONCAT() or CONCAT_WS() to perform the concatenation.

What is data type varchar?

The VARCHAR data type stores character strings of varying length that contain single-byte and (if the locale supports them) multibyte characters, where m is the maximum size (in bytes) of the column and r is the minimum number of bytes reserved for that column.


2 Answers

Unfortunately, this error is a serious pain and there's no easy way to troubleshoot it. When I've encountered it in the past, I've always just had to comment out groups of columns until I find the culprit.

Another approach might be to use the ISNUMERIC() function in in T-SQL to try and find the culprit. Assuming every column in your destination table is numeric (adjust accordingly if it's not), you could try this:

SELECT *
  FROM SourceTable
 WHERE ISNUMERIC(Column1) = 0
    OR ISNUMERIC(Column2) = 0
    OR ISNUMERIC(Column3) = 0
    OR ISNUMERIC(Column4) = 0
    ...

This will expose the row that contains your non-numeric value, and should make it pretty clear which column it's in. I know it's tedious, but at least it helps you hunt down the actual value, in addition to the column that's causing trouble.

like image 143
SqlRyan Avatar answered Oct 12 '22 04:10

SqlRyan


You don't specify SQL Server Version or number of rows.

For SQL2005+ adding the OUTPUT clause to the INSERT might help identify the rogue row in that it will output the inserted rows until it encounters an error so the next row is the one with the problem

DECLARE @Source TABLE
(
Col1 VARCHAR(10),
Col2 VARCHAR(10)
)

INSERT INTO @Source 
SELECT '1','1' UNION ALL
SELECT '2','2' UNION ALL
SELECT '3','3' UNION ALL
SELECT '4A','4' UNION ALL
SELECT '5','5' 


DECLARE @Destination TABLE
(
Col1 INT,
Col2 VARCHAR(10)
)

INSERT INTO @Destination 
OUTPUT inserted.*
SELECT * 
FROM @Source

Returns

    (5 row(s) affected)
    Col1        Col2
    ----------- ----------
    1           1
    2           2
    3           3
    Msg 245, Level 16, State 1, Line 23
    Conversion failed when converting the varchar value '4A' to data type int.
like image 31
Martin Smith Avatar answered Oct 12 '22 03:10

Martin Smith