varbinary in stringa su SQL Server


93

Come convertire un valore di colonna da varbinary(max)a varcharin un formato leggibile dall'uomo?


3
voglio varchar poiché il valore è stato istertato dal valore stringa .. Voglio leggere ciò che è stato scritto ..
Bilgin Kılıç

@MartinSmith ppl mi spingono a cambiare. Quindi ha segnato di nuovo la tua risposta. grazie per i tuoi gentili commenti.
Bilgin Kılıç

Le persone sembrano riscontrarlo dai motori di ricerca e in base alla votazione il parametro di stile 2 sembra più comunemente richiesto, ma questo non corrisponde a quello che era il tuo requisito originale
Martin Smith

Risposte:


87

"Conversione di a varbinaryin avarchar " può significare cose diverse.

Se il varbinary è la rappresentazione binaria di una stringa in SQL Server (ad esempio restituita dal casting varbinarydirettamente o dalle funzioni DecryptByPassPhraseo DECOMPRESS) puoi semplicemente CASTfarlo

declare @b varbinary(max)
set @b = 0x5468697320697320612074657374

select cast(@b as varchar(max)) /*Returns "This is a test"*/

Questo è l'equivalente dell'uso CONVERTcon un parametro di stile di 0.

CONVERT(varchar(max), @b, 0)

Sono disponibili altri parametri di stile CONVERTper requisiti diversi, come indicato in altre risposte.


38
QUESTA RISPOSTA NON È CORRETTA. L'ho testato su un tavolo con SID utente: la quantità di valori espressi distinti è inferiore alla quantità di SID binari distinti. Dovresti usare CONVERT (VARCHAR (...), binaryValue, 2) per ottenere un valore univoco - la risposta di Gunjan Juyal è quella giusta - dovrebbe essere contrassegnata come soluzione
Philipp Munin

13
@PhilippMunin - Le due risposte fanno cose diverse. Questo prende il risultato di un'espressione come SELECT CAST('This is a test' AS VARBINARY(100))che è 0x5468697320697320612074657374nelle mie regole di confronto predefinite e lo converte di nuovo nella varcharstringa. La risposta di Gunjan restituisce la rappresentazione esadecimale come una stringa ('5468697320697320612074657374') Presumibilmente questa interpretazione è corretta per le necessità dell'OP così come l'hanno accettata.
Martin Smith

8
QUESTA RISPOSTA È CORRETTA! L'ho provato e fa quello che io e l'OP volevamo.
Ronnie Overby

1
@BIDeveloper se avessi letto i commenti sopra (in particolare il mio) dovresti renderti conto che il problema è che "convertire varbinary in varchar" può essere interpretato in modi diversi. In effetti questo è il motivo per cui CONVERTha un parametro di stile per selezionare il modo in cui desideri (la mia interpretazione è lo stile predefinito) Quindi questa risposta potrebbe non essere ciò di cui hai bisogno per il tuo caso d'uso al momento, ma è corretta per altri casi d'uso. Compreso l'interrogante originale che ha specificato "forma leggibile dall'uomo" non esadecimale.
Martin Smith

1
SQL 2005 puoi usare sys.fn_sqlvarbasetostr (@binary) poiché il CONVERT sarà vuoto per me
TheNerdyNerd

149

La seguente espressione ha funzionato per me:

SELECT CONVERT(VARCHAR(1000), varbinary_value, 2);

Ecco maggiori dettagli sulla scelta dello stile (il terzo parametro).


Come descritto da @ lara-mayugba di seguito, lo stile 1 include il prefisso 0x nel risultato che può essere utile ..
Stan

@celerno perché dovrebbero? Questo non fa ciò di cui avevano bisogno.
Martin Smith

1
Prima del 2008 usa sys.fn_sqlvarbasetostr (@binaryfield)
TheNerdyNerd

@metabuddy - in che modo è disinformazione? Si afferma che il termine "Conversione di un varbinary in un varchar" può essere eseguito in diversi modi e che questi sono controllati dal parametro style. Solo perché il parametro di stile in quella risposta non è quello di cui hai bisogno per il tuo caso (ma è quello che risponde alla domanda originale) non è una disinformazione
Martin Smith

Per enfatizzare il commento / risposta di @TheNerdyNerd, l'espressione sarebbe `select sys.fn_sqlvarbasetostr (@b) / * restituisce 0x5468697320697320612074657374 * / Supponendo che uno cambi varchar (max) in varchar (8000) perché prima del 2008 non lo utilizza .
Zachary Scott

63

In realtà la risposta migliore è

SELECT CONVERT(VARCHAR(1000), varbinary_value, 1);

utilizzando " 2" si interrompe " 0x" all'inizio di varbinary.


@BojieShuai Volevi dire "Sono così d'accordo che è impossibile per me essere ancora più d'accordo", o "Ero d'accordo ma non lo faccio più"?
howcheng

@howcheng intendo "non posso essere più d'accordo". Grazie per averlo fatto notare.
Bojie Shuai

15

Prova questo

SELECT CONVERT(varchar(5000), yourvarbincolumn, 0)

6
Ho dovuto usare un 2 come terzo parametro, invece di uno zero. Ho trovato la risposta qui .
WEFX

1
nel mio caso devo usare MAX invece di 5000
sulaiman sudirman

0

Per una VARBINARY(MAX)colonna, ho dovuto usare NVARCHAR(MAX):

cast(Content as nvarchar(max))

O

CONVERT(NVARCHAR(MAX), Content, 0)
VARCHAR(MAX) didn't show the entire value

0

Ho provato questo, ha funzionato per me:

declare @b2 VARBINARY(MAX) 
set @b2 = 0x54006800690073002000690073002000610020007400650073007400
SELECT CONVERT(nVARCHAR(1000), @b2, 0);

0

Dai un'occhiata al seguito perché stavo lottando troppo per il post originale [Qui] [1]

bcp "SELECT CAST(BINARYCOL AS VARCHAR(MAX)) FROM OLTP_TABLE WHERE ID=123123 AND COMPANYID=123" 
queryout "C:\Users\USER\Documents\ps_scripts\res.txt" -c -S myserver.db.com  -U admin -P password


  [1]: https://stackoverflow.com/questions/60525910/powershell-truncating-sql-query-output?noredirect=1#comment107077512_60525910
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.