Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Server : converting varchar to INT

Tags:

sql-server

I am stuck on converting a varchar column UserID to INT. I know, please don't ask why this UserID column was not created as INT initially, long story.

So I tried this, but it doesn't work. and give me an error:

select CAST(userID AS int) from audit 

Error:

Conversion failed when converting the varchar value '1581............................................................................................................................' to data type int.

I did select len(userID) from audit and it returns 128 characters, which are not spaces.

I tried to detect ASCII characters for those trailing after the ID number and ASCII value = 0.

I have also tried LTRIM, RTRIM, and replace char(0) with '', but does not work.

The only way it works when I tell the fixed number of character like this below, but UserID is not always 4 characters.

select CAST(LEFT(userID, 4) AS int) from audit 
like image 799
Milacay Avatar asked Apr 12 '13 17:04

Milacay


People also ask

Can we convert varchar to int in SQL Server?

SQL Server's CAST() and CONVERT() methods can be used to convert VARCHAR to INT.

Can you convert varchar to numeric in SQL?

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 convert Nvarchar value to datatype int in SQL Server?

1 Answer. "CONVERT" considers the column name, not the string that has the column name; your current expression is attempting to convert the string A. my_NvarcharColumn to an integer instead of the column content. SELECT convert (int, N'A.

What is CAST function in SQL?

SQL Server CAST() Function The CAST() function converts a value (of any type) into a specified datatype. Tip: Also look at the CONVERT() function.


1 Answers

You could try updating the table to get rid of these characters:

UPDATE dbo.[audit]   SET UserID = REPLACE(UserID, CHAR(0), '')   WHERE CHARINDEX(CHAR(0), UserID) > 0; 

But then you'll also need to fix whatever is putting this bad data into the table in the first place. In the meantime perhaps try:

SELECT CONVERT(INT, REPLACE(UserID, CHAR(0), ''))   FROM dbo.[audit]; 

But that is not a long term solution. Fix the data (and the data type while you're at it). If you can't fix the data type immediately, then you can quickly find the culprit by adding a check constraint:

ALTER TABLE dbo.[audit]   ADD CONSTRAINT do_not_allow_stupid_data   CHECK (CHARINDEX(CHAR(0), UserID) = 0); 

EDIT

Ok, so that is definitely a 4-digit integer followed by six instances of CHAR(0). And the workaround I posted definitely works for me:

DECLARE @foo TABLE(UserID VARCHAR(32)); INSERT @foo SELECT 0x31353831000000000000;  -- this succeeds: SELECT CONVERT(INT, REPLACE(UserID, CHAR(0), '')) FROM @foo;  -- this fails: SELECT CONVERT(INT, UserID) FROM @foo; 

Please confirm that this code on its own (well, the first SELECT, anyway) works for you. If it does then the error you are getting is from a different non-numeric character in a different row (and if it doesn't then perhaps you have a build where a particular bug hasn't been fixed). To try and narrow it down you can take random values from the following query and then loop through the characters:

SELECT UserID, CONVERT(VARBINARY(32), UserID)   FROM dbo.[audit]   WHERE UserID LIKE '%[^0-9]%'; 

So take a random row, and then paste the output into a query like this:

DECLARE @x VARCHAR(32), @i INT; SET @x = CONVERT(VARCHAR(32), 0x...); -- paste the value here SET @i = 1; WHILE @i <= LEN(@x) BEGIN   PRINT RTRIM(@i) + ' = ' + RTRIM(ASCII(SUBSTRING(@x, @i, 1)))   SET @i = @i + 1; END 

This may take some trial and error before you encounter a row that fails for some other reason than CHAR(0) - since you can't really filter out the rows that contain CHAR(0) because they could contain CHAR(0) and CHAR(something else). For all we know you have values in the table like:

SELECT '15' + CHAR(9) + '23' + CHAR(0); 

...which also can't be converted to an integer, whether you've replaced CHAR(0) or not.

I know you don't want to hear it, but I am really glad this is painful for people, because now they have more war stories to push back when people make very poor decisions about data types.

like image 140
Aaron Bertrand Avatar answered Oct 08 '22 08:10

Aaron Bertrand