Domanda

Sto usando SQL Server 2000 stampare alcuni valori da una tabella utilizzando PRINT.Con la maggior parte dei processi non di dati stringa, posso cast di tipo nvarchar per essere in grado di stampare, ma di valori binari tentativo di convertire utilizzando il bit di rappresentazione dei caratteri.Per esempio:

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

Previsto:

0x12345678

Invece, stampe due caratteri incomprensibili.

Come faccio a stampare il valore di dati binari?C'è un built-in o non ho bisogno di tirare la mia?

Aggiornamento:Questo non è il solo valore sulla linea, quindi non posso STAMPARE @binvalue.E 'qualcosa di più, come la STAMPA di N'other roba' + ????+ N more roba'.Non sono sicuro se che fa la differenza:Non ho cercato solo di STAMPA @binvalue di per sé.

È stato utile?

Soluzione

Se si fosse su Sql Server 2005, è possibile utilizzare questo:

print master.sys.fn_varbintohexstr(@binvalue)

Non credo che esiste nel 2000, però, così si potrebbe avere a rotolare il vostro proprio.

Altri suggerimenti

Non utilizzare master.sys.fn_varbintohexstr - è terribilmente lento, privi di documenti, non supportato, e potrebbe andare via in una versione futura di SQL Server.

Se avete bisogno di convertire binary(16) per hex char, utilizzare convert:

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

Perché 34?perché 16*2 + 2 = 34, che è "0x" - 2 simboli, più 2 simboli per ogni carattere.

Abbiamo provato a fare 2 query su una tabella con 200000 righe:

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

il primo è eseguito 2 minuti, mentre la seconda - 4 secondi.

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

Da using varchar(max) hai vinto t devono preoccuparsi di specificare le dimensioni (tipo di).

Aggiunta di una risposta che mostra un altro esempio di conversione di binario i dati in una stringa esadecimale, e di nuovo indietro.

voglio convertire il massimo timestamp valore in varchar:

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

Che restituisce:

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

Nota:È importante che si utilizza CONVERT per la conversione varbinary -> varchar.Utilizzando CAST non funziona:

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

tratterà i dati binari come caratteri piuttosto che i valori esadecimali, restituendo una stringa vuota.

Invertire

Per convertire la stored hex stringa a un timestamp:

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

Nota:Ogni codice è rilasciato nel pubblico dominio.Nessuna attribuzione richiesta.

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

Non cast.

Casting converte il file binario di testo dal valore corrispondente impostazione di confronto per il database specifico.

[Begin Modifica] Se avete bisogno stampato il valore in una variabile stringa, utilizzare la funzione suggerita da Eric Z Barba.

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 questa funzione non è a vostra disposizione a causa di versioni server o perché ha bisogno di autorizzazioni speciali, è possibile creare una propria funzione.

Per vedere come funzione è stata implementata in SQL Server 2005 Express edition è possibile eseguire:

sp_helptext 'fn_varbintohexsubstring'

Mi sono imbattuto in questa domanda mentre si è alla ricerca di una soluzione ad un problema simile, mentre la stampa hex valore restituito dal 'hashbytes' in funzione in SQL Server 2005.

Purtroppo in questa versione di SQL Server, la CONVERSIONE non sembra funzionare per tutti, solo fn_varbintohexsubstring fa la cosa giusta:

Ho fatto:

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)

Ecco il risultato che ho ottenuto in 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

(in realtà, c'è un carattere non stampabile prima del '4Vx s - posterei un'immagine, ma non ho abbastanza punti di sicurezza).


Modifica:Basta aggiungere - su SQL Server 2008 R2 il problema con la CONVERSIONE è fissato con il seguente output:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top