¿Cómo puedo imprimir un valor binario como hexadecimal en TSQL?
-
09-06-2019 - |
Pregunta
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 convertirlos a nvarchar para poder imprimirlos, 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 galimatías.
¿Cómo puedo imprimir el valor de los datos binarios?¿Hay uno incorporado o necesito rodar el mío?
Actualizar:Este no es el único valor en la línea, por lo que no puedo simplemente IMPRIMIR @binvalue.Es algo más como PRINT N'otras cosas' + ????+ N'más cosas'.No estoy seguro si eso hace una diferencia:No intenté simplemente IMPRIMIR @binvalue por sí solo.
Solución
Si estuvieras en Sql Server 2005 podrías usar esto:
print master.sys.fn_varbintohexstr(@binvalue)
Sin embargo, no creo que eso exista en 2000, por lo que es posible que tengas que crear el tuyo propio.
Otros consejos
No utilice
master.sys.fn_varbintohexstr
- es terriblemente lento, indocumentados, sin apoyo y podría desaparecer en una versión futura de SQL Server.
Si necesitas convertir binary(16)
para hexadecimal, use convert
:
convert(char(34), @binvalue, 1)
¿Por qué 34?porque 16*2 + 2 = 34
, es decir, "0x": 2 símbolos, más 2 símbolos por cada carácter.
Intentamos realizar 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 dura 2 minutos, mientras que el segundo dura 4 segundos.
select convert(varchar(max), field , 1)
from table
Por using varchar(max)
no tendrá que preocuparse por especificar el tamaño (más o menos).
Agregar una respuesta que muestra otro ejemplo de conversión. binario datos en una cadena hexadecimal y viceversa.
quiero convertir el más alto timestamp
valor 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 uses CONVERT
para convertir varbinary -> varchar
.Usando CAST
no trabajará:
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 hexadecimal almacenada nuevamente en una marca de tiempo:
SELECT CAST(CONVERT(varbinary(50), '0x000000000086862C', 1) AS timestamp)
Nota:Cualquier código se libera al dominio público.No se requiere atribución.
DECLARE @binvalue binary(4)
SET @binvalue = 0x61000000
PRINT @binvalue
PRINT cast('a' AS binary(4))
PRINT cast(0x61 AS varchar)
No lances.
La conversión convierte el binario en texto por valor en la configuración de intercalación correspondiente para la base de datos específica.
Comenzar editar] 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 tu disposición por versiones del servidor o porque necesita permisos especiales, puedes crear tu propia función.
Para ver cómo se implementó esa función en SQL Server 2005 Express edición puedes ejecutar:
sp_helptext 'fn_varbintohexsubstring'
Me encontré con esta pregunta mientras buscaba una solución a un problema similar al imprimir el valor hexadecimal devuelto por la función 'hashbytes' en SQL Server 2005.
Lamentablemente, en esta versión de SQL Server, CONVERT no parece funcionar en absoluto, sólo fn_varbintohexsubstring hace lo correcto:
Hice:
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)
Aquí está 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 carácter no imprimible antes del '4Vx; publicaría una imagen, pero todavía 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