2010-08-30 19 views
18

Esta respuesta a lo que parece ser la misma pregunta:MS SQL Server - Convierte la cadena HEX a entero

Convert integer to hex and hex to integer

..does no funcionan para mí.

No puedo ir a una cadena HEX a un número entero utilizando MS SQL server 2005 CAST o CONVERT. ¿Me estoy perdiendo algo trivial? He buscado mucho, y lo mejor que puedo encontrar son funciones de usuario prolijas para pasar de un valor de cadena hexadecimal a algo que se parece a un decimal int. Seguramente hay una manera simple de hacer esto directamente en una consulta que utiliza funciones integradas en lugar de escribir una función de usuario.

Gracias

Editar para incluir ejemplos:

select convert (int, 0x89)

funciona como se esperaba, pero

select convert (int, ' 0x '+ subcadena (msg, 66, 2)) de alguna tabla

me obtiene:

"Error de conversión al convertir el valor varchar '0x89' a tipo de datos int."

una conversión explícita extra:

select convert (int, CAST ('0x89' AS VARBINARY))

ejecuta, pero devuelve 813185081.

Sustituyendo 'Int', 'Decimal', etc. para 'Varbinary' da como resultado un error. En general, las cadenas que parecen ser numéricas se interpretan como numéricas si es necesario, pero no en este caso, y no parece haber un CAST que reconozca HEX. Me gustaría pensar que hay algo simple y obvio, y me lo he perdido.

Microsoft Management Studio de SQL Server Express 9.00.3042.00

Microsoft SQL Server 2005 - 9.00.3080.00 (Intel X86) sep 6 2009 01:43:32 Derechos de autor (c) 1988-2005 Microsoft Corporation Express Edition con servicios avanzados en Windows NT 5.1 (Build 2600: Service Pack 3)

En resumen: quiero tomar una cadena hexadecimal que es un valor en una tabla, y mostrarla como parte de un resultado de la consulta como un entero decimal, usando solo funciones definidas por el sistema, no un UDF.

+1

¿Recibirá un error específico o resultados inesperados? Los ejemplos serían útiles. – LittleBobbyTables

+0

¿Qué significa "no funciona"? CONVERT() es una función incorporada y es muy poco probable que no funcione. Por lo tanto, publique su versión y edición MSSQL, más los resultados de ejecutar las dos consultas SELECT de la respuesta a la que vinculó: SELECCIONAR CONVERTIR (VARBINARIO (8), 16777215) y SELECCIONAR CONVERTIR (INT, 0xFFFFFF) – Pondlife

+0

¿Ha visto esto? Mira los comentarios ... http://blog.sqlauthority.com/2010/02/01/sql-server-question-how-to-convert-hex-to-decimal/ –

Respuesta

30

Gracias por dar algunos ejemplos más explícitos. Por lo que puedo decir de la documentación y Google, esto no es posible en MSSQL 2005 sin un UDF u otro código de procedimiento.En MSSQL 2008 parámetro estilo de la función CONVERT() ahora supoprts datos binarios, por lo que puede hacerlo directamente como esto:

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

En versiones anteriores, sus opciones son:

  • Usar una UDF (TSQL o CLR; CLR en realidad podría ser más fácil para esto)
  • Ajustar el SELECCIONAR en un procedimiento almacenado (pero probablemente aún tenga el equivalente de una UDF en él)
  • Convertirlo en la interfaz de la aplicación
  • Promueve a MSSQL 2008

Si la conversión de los datos es sólo para fines de visualización, la aplicación podría ser la solución más fácil: el formato de los datos por lo general pertenece allí de todos modos. Si debe hacerlo en una consulta, entonces una UDF es más fácil, pero el rendimiento puede no ser bueno (sé que dijo que prefería no usar una UDF, pero no está claro por qué). Supongo que actualizar a MSSQL 2008 solo para esto probablemente no sea realista.

Finalmente, FYI el número de versión que incluyó es la versión de Management Studio, no el número de versión de su servidor. Para obtener eso, consulte el servidor con select @@version o select serverproperty('ProductVersion').

+0

Gracias y gracias por hacerme aclarar mi pregunta. Busqué los parámetros de Estilo para la versión de Convertir que tengo, pensando que podría estar allí, pero me quedé corto. Esta fue una consulta ad-hoc (sin aplicación) y esperaba evitar ajustar el DB agregando un UDF. En algún momento, puede convertirse en parte de una aplicación y todos estos problemas desaparecerán. – mickeyf

+0

interesante notar que esto no funciona: 'select convert (int, convertir (varbinary, '0x1', 1))' pero esto: 'select convert (int, convertir (varbinary '0x01 ', 1)) ' Por alguna razón, el cero inicial DESPUÉS del' 0x' es importante para cadenas de un solo dígito. –

+2

@ carl.anderson [Este comportamiento está explícitamente documentado:] (https://msdn.microsoft.com/en-us/library/ms187928.aspx#Anchor_8) "La expresión debe estar compuesta por un número par de dígitos hexadecimales. .. Si la expresión contiene un número impar de caracteres ... se genera un error ". –