Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MS SQL server - convert HEX string to integer

Tags:

This answer to what looks like the same question:

Convert integer to hex and hex to integer

..does not work for me.

I am not able to go to a HEX string to an integer using MS SQL server 2005 CAST or CONVERT. Am I missing something trivial? I have searched extensively, and the best I can find are long-winded user functions to go from a hex string value to something that looks like a decimal int. Surely there is a simple way to do this directly in a query using built in functions rather than writing a user function?

Thanks

Edit to include examples:

select CONVERT(INT, 0x89)

works as expected, but

select CONVERT(INT, '0x' + substring(msg, 66, 2)) from sometable

gets me:

"Conversion failed when converting the varchar value '0x89' to data type int."

an extra explicit CAST:

select CONVERT(INT, CAST('0x89' AS VARBINARY))

executes, but returns 813185081.

Substituting 'Int', 'Decimal', etc for 'Varbinary' results in an error. In general, strings that appear to be numeric are interpreted as numeric if required, but not in this case, and there does not appear to be a CAST that recognizes HEX. I would like to think there is something simple and obvious and I've just missed it.

Microsoft SQL Server Management Studio Express 9.00.3042.00

Microsoft SQL Server 2005 - 9.00.3080.00 (Intel X86) Sep 6 2009 01:43:32 Copyright (c) 1988-2005 Microsoft Corporation Express Edition with Advanced Services on Windows NT 5.1 (Build 2600: Service Pack 3)

To sum up: I want to take a hex string which is a value in a table, and display it as part of a query result as a decimal integer, using only system defined functions, not a UDF.

like image 813
MickeyfAgain_BeforeExitOfSO Avatar asked Aug 30 '10 22:08

MickeyfAgain_BeforeExitOfSO


People also ask

Can we convert string to int in SQL?

CAST and CONVERT can be used to convert a string to a number of any data type. For example, you can convert a string to a number of data type INTEGER. TO_DATE converts a formatted date string to a date integer. TO_TIMESTAMP converts a formatted date and time string to a standard timestamp.


1 Answers

Thanks for giving some more explicit examples. As far as I can tell from the documentation and Googling, this is not possible in MSSQL 2005 without a UDF or other procedural code. In MSSQL 2008 the CONVERT() function's style parameter now supoprts binary data, so you can do it directly like this:

select convert(int, convert(varbinary, '0x89', 1)) 

In previous versions, your choices are:

  • Use a UDF (TSQL or CLR; CLR might actually be easier for this)
  • Wrap the SELECT in a stored procedure (but you'll probably still have the equivalent of a UDF in it anyway)
  • Convert it in the application front end
  • Upgrade to MSSQL 2008

If converting the data is only for display purposes, the application might be the easiest solution: data formatting usually belongs there anyway. If you must do it in a query, then a UDF is easiest but the performance may not be great (I know you said you preferred not to use a UDF but it's not clear why). I'm guessing that upgrading to MSSQL 2008 just for this probably isn't realistic.

Finally, FYI the version number you included is the version of Management Studio, not the version number of your server. To get that, query the server itself with select @@version or select serverproperty('ProductVersion').

like image 78
Pondlife Avatar answered Oct 06 '22 09:10

Pondlife