Pergunta

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

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

Esperado:

0x12345678

Em vez disso, ele imprime dois caracteres sem sentido.

Como posso imprimir o valor dos dados binários?Existe um embutido ou preciso criar o meu próprio?

Atualizar:Este não é o único valor na linha, então não posso simplesmente PRINT @binvalue.É algo mais parecido com PRINT N'outras coisas' + ????+ N'mais coisas'.Não tenho certeza se isso faz diferença:Não tentei apenas PRINT @binvalue sozinho.

Foi útil?

Solução

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

print master.sys.fn_varbintohexstr(@binvalue)

Eu não acho que isso exista em 2000, então você pode ter que criar o seu próprio.

Outras dicas

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

Se você precisar converter binary(16) para hexadecimal, use convert:

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

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

Tentamos fazer 2 consultas em uma tabela com 200.000 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 dura 4 segundos.

select convert(varchar(max), field , 1) 
from table

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

Adicionando uma resposta que mostra outro exemplo de conversão binário dados em uma string hexadecimal e vice-versa.

eu quero converter o mais alto timestamp valor em varchar:

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

O que retorna:

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

Observação:É importante que você use CONVERT converter varbinary -> varchar.Usando CAST não funciona:

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

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

Inverta

Para converter a string hexadecimal armazenada de volta em um carimbo de data/hora:

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

Observação:Qualquer código é lançado em domínio público.Nenhuma atribuição necessária.

DECLARE @binvalue binary(4)
SET @binvalue = 0x61000000
PRINT @binvalue 
PRINT cast('a' AS binary(4))
PRINT cast(0x61 AS varchar)

Não lance.

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 Editar] 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 esta função não estiver à sua disposição devido a versões do servidor ou porque necessita de permissões especiais, você pode criar sua própria função.

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

sp_helptext 'fn_varbintohexsubstring'

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, 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's - eu postaria uma imagem, mas ainda não tenho pontos suficientes).


Editar:Apenas para complementar o SQL Server 2008 R2, o problema com CONVERT foi 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top