tamaño que insertar datos data convert como cast almacena sql-server tsql

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:

  1. select master.sys.fn_varbintohexstr(field) from table`

  2. 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).