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.

¿Fue útil?

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:

  1. select master.sys.fn_varbintohexstr(field)
    from table`
    
  2. 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top