it-swarm-pt.tech

Como posso imprimir um valor binário como hexadecimal no SQL?

Estou usando o SQL Server 2000 para imprimir alguns valores de uma tabela usando PRINT. Na maioria dos dados que não são de cadeia, posso converter para nvarchar para poder imprimi-los, mas os valores binários tentam converter usando a representação de bits dos caracteres. Por exemplo:

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)

Esperado:

0x12345678

Em vez disso, imprime dois caracteres sem sentido.

Como posso imprimir o valor dos dados binários? Existe um built-in ou preciso rolar o meu?

Atualização: esse não é o único valor da linha; portanto, não posso apenas PRINT @binvalue. É algo mais como PRINT N'other stuff '+ ???? + N'mais coisas '. Não tenho certeza se isso faz alguma diferença: eu não tentei apenas PRINT @binvalue por si só.

35
Tadmas

Se você estivesse no Sql Server 2005, poderia usar o seguinte:

print master.sys.fn_varbintohexstr(@binvalue)

Eu acho que não existe em 2000, então você pode ter que fazer o seu próprio.

29
Eric Z Beard

Não use master.sys.fn_varbintohexstr - é terrivelmente lento, não documentado, sem suporte e pode desaparecer em uma versão futura do SQL Server.

Se você precisar converter binary(16) em hex char, use convert:

convert(char(34), @binvalue, 1)

Por que 34? porque 16*2 + 2 = 34, ou seja, "0x" - 2 símbolos, mais 2 símbolos para cada caractere.

Tentamos fazer 2 consultas em uma tabela com 200000 linhas:

  1. select master.sys.fn_varbintohexstr(field)
    from table`
    
  2. select convert(char(34), field, 1)
    from table`
    

o primeiro dura 2 minutos, enquanto o segundo - 4 segundos.

44
Ihor B.
select convert(varchar(max), field , 1) 
from table

Por using varchar(max) você não terá que se preocupar em especificar o tamanho (mais ou menos).

22
Charlie Affumigato

Adicionando uma resposta que mostra outro exemplo de conversão de dados binários em uma sequência hexadecimal e vice-versa.

eu quero converter o valor mais alto de timestamp em varchar:

SELECT 
   CONVERT(
      varchar(50), 
      CAST(MAX(timestamp) AS varbinary(8)), 
      1) AS LastTS
FROM Users

Que retorna:

LastTS
==================
0x000000000086862C

Nota: é importante que você use CONVERT para converter varbinary -> varchar. Usar CAST não funcionará:

SELECT 
   CAST(
      CAST(MAX(timestamp) AS varbinary(8)) 
      AS varchar(50) ) AS LastTS
FROM Users

tratará os dados binários como caracteres em vez de valores hexadecimais, retornando uma string vazia.

Inverta

Para converter a sequência hexadecimal armazenada em um carimbo de data/hora:

SELECT CAST(CONVERT(varbinary(50), '0x000000000086862C', 1) AS timestamp)

Nota: qualquer código é liberado para o domínio público. Nenhuma atribuição é necessária.

8
Ian Boyd

Me deparei com essa pergunta enquanto procurava uma solução para um problema semelhante ao imprimir o valor hexadecimal retornado da função 'hashbytes' no SQL Server 2005.

Infelizmente nesta versão do SQL Server, o CONVERT parece não funcionar, apenas fn_varbintohexsubstring faz a coisa correta:

Eu fiz:

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)

Aqui está o resultado que obtive no 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

(na verdade, há um caractere não imprimível antes dos '4Vx' - eu publicaria uma imagem, mas ainda não tenho pontos suficientes).


Editar: Apenas para adicionar o SQL Server 2008 R2, o problema com o CONVERT é corrigido com a seguinte saída:

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
2
David Claughton
DECLARE @binvalue binary(4)
SET @binvalue = 0x61000000
PRINT @binvalue 
PRINT cast('a' AS binary(4))
PRINT cast(0x61 AS varchar)

Não jogue.

A conversão converte o binário em texto por valor na configuração de agrupamento correspondente para o banco de dados específico.

[Begin Edit] Se você precisar do valor impresso em uma variável de string, use a função 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

Se essa função não estiver à sua disposição devido às versões do servidor ou porque precisar de permissões especiais, você poderá criar sua própria função.

Para ver como essa função foi implementada na edição do SQL Server 2005 Express, você pode executar:

sp_helptext 'fn_varbintohexsubstring'
2
Ricardo C