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 caracteres en bits. Por ejemplo:
DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)
Esperado:
0x12345678
En cambio, imprime dos personajes galimatías.
¿Cómo puedo imprimir el valor de los datos binarios? ¿Hay un incorporado o necesito rodar el mío?
Actualización: 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'other stuff '+ ???? + N'más cosas '. No estoy seguro de si eso marca la diferencia: no intenté simplemente IMPRIMIR @binvalue por sí mismo.
Si estuvieras en SQL Server 2005, podrías usar esto:
print master.sys.fn_varbintohexstr(@binvalue)
Sin embargo, no creo que exista en el 2000, por lo que es posible que tenga que rodar el suyo.
No use
master.sys.fn_varbintohexstr
: Es terriblemente lento, indocumentado, no compatible y podría desaparecer en una versión futura de SQL Server.
Si necesita convertir binary(16)
a hexadecimal char, use convert
:
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 carácter.
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 dura 2 minutos, mientras que el segundo - 4 segundos.
select convert(varchar(max), field , 1)
from table
Por using varchar(max)
no tendrá que preocuparse por especificar el tamaño (tipo de).
Agregar una respuesta que muestra otro ejemplo de conversión de datos binarios en una cadena hexadecimal y viceversa.
quiero convertir el valor más alto de timestamp
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
. 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.
Para convertir la cadena hexadecimal almacenada a 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 echar.
La conversión convierte el binario en texto por valor en la configuración de clasificación correspondiente para la base de datos específica.
[Comenzar edición] 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 Express de SQL Server 2005, puede ejecutar:
sp_helptext 'fn_varbintohexsubstring'
Encontré 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, solo fn_varbintohexsubstring hace lo correcto:
Yo 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 de los '4Vx's; 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