varbinary to string auf SQL Server

93

Wie konvertiere ich einen Spaltenwert von varbinary(max)in varcharin lesbare Form?

Bilgin Kılıç
quelle
3
Ich möchte varchar, da der Wert vom Zeichenfolgenwert abgelenkt wurde. Ich meine zu lesen, was geschrieben wurde.
Bilgin Kılıç
@ MartinSmith ppl drängen mich zu ändern. Also markiere deine Antwort wieder zurück. Vielen Dank für Ihre freundlichen Kommentare.
Bilgin Kılıç
Die Leute scheinen von Suchmaschinen darauf gestoßen zu sein, und basierend auf der Abstimmung scheint der Parameter für Stil 2 häufiger erforderlich zu sein, aber dies entspricht nicht Ihren ursprünglichen Anforderungen
Martin Smith,

Antworten:

87

„Eine Konvertierung varbinaryauf ein varchar“ kann verschiedene Dinge bedeuten.

Wenn die Varbinary die binäre Darstellung einer Zeichenfolge in SQL Server ist (z. B. durch Casting varbinarydirekt oder von den Funktionen DecryptByPassPhraseoder zurückgegeben DECOMPRESS), können Sie dies einfach CASTtun

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

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

Dies entspricht der Verwendung CONVERTmit einem Stilparameter von 0.

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

Andere Stilparameter sind CONVERTfür unterschiedliche Anforderungen verfügbar, wie in anderen Antworten angegeben.

Martin Smith
quelle
38
Diese Antwort ist nicht richtig. Ich habe es in einer Tabelle mit Benutzer-SIDs getestet - die Anzahl der Distinct Casting-Werte ist geringer als die Anzahl der Distinct-Binär-SIDs. Sie sollten CONVERT (VARCHAR (...), binaryValue, 2) verwenden, um einen eindeutigen Wert zu erhalten - die Antwort von Gunjan Juyal ist die richtige - sie sollte als Lösung markiert werden
Philipp Munin
13
@PhilippMunin - Die beiden Antworten machen unterschiedliche Dinge. Dieser nimmt das Ergebnis eines Ausdrucks wie SELECT CAST('This is a test' AS VARBINARY(100))die 0x5468697320697320612074657374in meiner Standardsortierung und wandelt sie in den Rücken varcharString. Gunjans Antwort gibt die hexadezimale Darstellung als Zeichenfolge zurück ('5468697320697320612074657374'). Vermutlich ist diese Interpretation für die Bedürfnisse des OP korrekt, da sie sie akzeptiert haben.
Martin Smith
8
Diese Antwort ist richtig! Ich habe es getestet und es macht das, was ich und das OP wollten.
Ronnie Overby
1
@BIDeveloper Wenn Sie die obigen Kommentare gelesen haben (insbesondere meine), sollten Sie sich darüber im Klaren sein, dass das Problem darin besteht, dass "Konvertieren von Varbinary in Varchar" auf verschiedene Arten interpretiert werden kann. Aus diesem Grund CONVERTgibt es einen Stilparameter, mit dem Sie auswählen können, wie Sie möchten (meine Interpretation ist der Standardstil). Daher ist diese Antwort im Moment möglicherweise nicht das, was Sie für Ihren Anwendungsfall benötigen, aber für andere Anwendungsfälle korrekt. Einschließlich der ursprünglichen Fragesteller, die "vom Menschen lesbare Form" angegeben haben, nicht hexadezimal.
Martin Smith
1
SQL 2005 können Sie sys.fn_sqlvarbasetostr (@binary) verwenden, da die CONVERT für mich leer sein wird
TheNerdyNerd
148

Der folgende Ausdruck hat bei mir funktioniert:

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

Hier finden Sie weitere Details zur Stilauswahl (der dritte Parameter).

Gunjan Juyal
quelle
Wie von @ lara-mayugba unten beschrieben, enthält Stil 1 das 0x-Präfix für das Ergebnis, das nützlich sein kann.
Stan
@celerno warum sollten sie? Das macht nicht das, was sie brauchten.
Martin Smith
1
Vor 2008 verwenden Sie sys.fn_sqlvarbasetostr (@binaryfield)
TheNerdyNerd
@metabuddy - inwiefern handelt es sich um Fehlinformationen? Es heißt, dass der Begriff "Konvertieren einer Varbinary in eine Varchar" auf verschiedene Arten erfolgen kann und dass diese durch den Stilparameter gesteuert werden. Nur weil der Stilparameter in dieser Antwort nicht derjenige ist, den Sie für Ihren Fall benötigen (sondern der die ursprüngliche Frage beantwortet), führt dies nicht zu Fehlinformationen
Martin Smith,
Um den Kommentar / die Antwort von @TheNerdyNerd hervorzuheben, lautet der Ausdruck `select sys.fn_sqlvarbasetostr (@b) / * gibt 0x5468697320697320612074657374 * zurück / Angenommen, man ändert varchar (max) in varchar (8000), da es vor 2008 nicht verwendet wird .
Zachary Scott
61

Eigentlich ist die beste Antwort

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

mit " 2" wird das " 0x" am Anfang des abgeschnitten varbinary.

Lara Mayugba
quelle
@BojieShuai Meinten Sie "Ich stimme so sehr zu, dass es mir unmöglich ist, noch weiter zuzustimmen" oder "Früher stimmte ich zu, aber ich tue es nicht mehr"?
Howcheng
@howcheng Ich meine "kann nicht mehr zustimmen". Vielen Dank für den Hinweis.
Bojie Shuai
15

Versuche dies

SELECT CONVERT(varchar(5000), yourvarbincolumn, 0)
dmajkic
quelle
6
Ich musste eine 2 als dritten Parameter anstelle einer Null verwenden. Ich habe diese Antwort hier gefunden .
WEFX
1
in meinem Fall muss ich MAX anstelle von 5000 verwenden
Sulaiman Sudirman
0

Für eine VARBINARY(MAX)Kolumne musste ich verwenden NVARCHAR(MAX):

cast(Content as nvarchar(max))

Oder

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

Ich habe es versucht, es hat bei mir funktioniert:

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

Probieren Sie es unten aus, da ich mit einem zu originellen Beitrag zu kämpfen hatte. [Hier] [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
Ribbit
quelle