sql server - que - ¿Cómo puedo imprimir un valor binario como hexadecimal en TSQL?
varbinary que almacena (6)
DECLARE @binvalue binary(4)
SET @binvalue = 0x61000000
PRINT @binvalue
PRINT cast(''a'' AS binary(4))
PRINT cast(0x61 AS varchar)
No eches.
Casting convierte el binario en texto por valor en la configuración de intercalación correspondiente para la base de datos específica.
[Begin Edit] Si necesita el valor impreso en una variable de cadena, use la función sugerida por Eric Z Beard.
DECLARE @mybin1 binary(16)
DECLARE @s varchar(100)
SET @mybin1 = 0x098F6BCD4621D373CADE4E832627B4F6
SET @s = ''The value of @mybin1 is: '' + sys.fn_varbintohexsubstring(0, @mybin1,1,0)
PRINT @s
Si esta función no está a su disposición debido a las versiones del servidor o porque necesita permisos especiales, puede crear su propia función.
Para ver cómo se implementó esa función en la edición SQL Server 2005 Express, puede ejecutar:
sp_helptext ''fn_varbintohexsubstring''
Estoy usando SQL Server 2000 para imprimir algunos valores de una tabla usando PRINT
. Con la mayoría de los datos que no son cadenas, puedo convertir a nvarchar para poder imprimirlo, pero los valores binarios intentan convertir utilizando la representación de bits de los caracteres. Por ejemplo:
DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)
Esperado:
0x12345678
En cambio, imprime dos caracteres sin sentido.
¿Cómo puedo imprimir el valor de los datos binarios? ¿Hay un built-in o tengo que hacer mi propio?
Actualización: Este no es el único valor en la línea, así que no puedo simplemente IMPRIMIR @binvalue. Es algo más parecido a PRINT N''other stuff ''+ ???? + N''más cosas ''. No estoy seguro si eso hace la diferencia: no intenté simplemente IMPRIMIR @binvalue por sí mismo.
Si estuviera en Sql Server 2005, podría usar esto:
print master.sys.fn_varbintohexstr(@binvalue)
Sin embargo, no creo que eso exista en el 2000, por lo que es posible que tengas que hacer el tuyo.
Me encontré con esta pregunta mientras buscaba una solución a un problema similar mientras imprimía el valor hexadecimal devuelto por la función ''hashbytes'' en SQL Server 2005.
Tristemente en esta versión de SQL Server, CONVERT no parece funcionar en absoluto, solo fn_varbintohexsubstring hace lo correcto:
Yo si:
DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT ''cast(@binvalue AS nvarchar): '' + CAST(@binvalue AS nvarchar)
PRINT ''convert(varchar(max), @binvalue, 0): '' + CONVERT(varchar(max), @binvalue, 0)
PRINT ''convert(varchar(max), @binvalue, 1): '' + CONVERT(varchar(max), @binvalue, 1)
PRINT ''convert(varchar(max), @binvalue, 2): '' + CONVERT(varchar(max), @binvalue, 2)
print ''master.sys.fn_varbintohexstr(@binvalue): '' + master.sys.fn_varbintohexstr(@binvalue)
Este es el resultado que obtuve en SQL Server 2005 (
cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 4Vx
convert(varchar(max), @binvalue, 2): 4Vx
master.sys.fn_varbintohexstr(@binvalue): 0x12345678
(En realidad, hay un personaje no imprimible antes del ''4Vx''s: publicaría una imagen, pero aún no tengo suficientes puntos).
Editar : solo para agregar: en SQL Server 2008 R2, el problema con CONVERT se soluciona con el siguiente resultado:
cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 0x12345678
convert(varchar(max), @binvalue, 2): 12345678
master.sys.fn_varbintohexstr(@binvalue): 0x12345678
Agregando una respuesta que muestra otro ejemplo de conversión de datos binarios en una cadena hexadecimal, y viceversa.
Quiero convertir el valor de timestamp
más alto en varchar
:
SELECT
CONVERT(
varchar(50),
CAST(MAX(timestamp) AS varbinary(8)),
1) AS LastTS
FROM Users
Que devuelve:
LastTS
==================
0x000000000086862C
Nota : Es importante que use CONVERT
para convertir varbinary -> varchar
. Usar CAST
no funcionará:
SELECT
CAST(
CAST(MAX(timestamp) AS varbinary(8))
AS varchar(50) ) AS LastTS
FROM Users
tratará los datos binarios como caracteres en lugar de valores hexadecimales, devolviendo una cadena vacía.
Revertirla
Para convertir la cadena hexagonal almacenada a una marca de tiempo:
SELECT CAST(CONVERT(varbinary(50), ''0x000000000086862C'', 1) AS timestamp)
Nota : Cualquier código se libera en el dominio público. No se requiere atribución.
No use
master.sys.fn_varbintohexstr
- es terriblemente lento, no documentado, no compatible, y puede desaparecer en una versión futura de SQL Server.
Si necesita convertir binary(16)
a hexadecimal, use
convert(char(34), @binvalue, 1)
¿Por qué 34? porque 16*2 + 2 = 34
, eso es "0x" - 2 símbolos, más 2 símbolos para cada char.
Intentamos hacer 2 consultas en una tabla con 200000 filas:
select master.sys.fn_varbintohexstr(field) from table`
select convert(char(34), field, 1) from table`
el primero corre 2 minutos, mientras que el segundo dura 4 segundos.
select convert(varchar(max), field , 1)
from table
Al using varchar(max)
no tendrá que preocuparse por especificar el tamaño (tipo de).