varbinary na ciąg w programie SQL Server

96

Jak przekonwertować wartość kolumny z varbinary(max)na varcharw postaci czytelnej dla człowieka?

Bilgin Kılıç
źródło
3
Chcę varchar, ponieważ wartość została wyryta z wartości ciągu .. Mam na myśli przeczytać to, co zostało napisane ..
Bilgin Kılıç
@MartinSmith ppl zmusza mnie do zmiany. Więc ponownie zaznaczyłem swoją odpowiedź. dziękuję za miłe komentarze.
Bilgin Kılıç
Wydaje się, że ludzie napotykają to w wyszukiwarkach i na podstawie głosowania parametr stylu 2 wydaje się częściej wymagany, ale to nie spełnia tego, co było pierwotnym wymaganiem
Martin Smith

Odpowiedzi:

91

„Zamiana a varbinaryna varchar” może oznaczać różne rzeczy.

Jeśli varbinary jest binarną reprezentacją ciągu w SQL Server (na przykład zwracany przez rzutowanie varbinarybezpośrednio lub z funkcji DecryptByPassPhraselub DECOMPRESS), możesz po prostu CASTto zrobić

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

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

Jest to odpowiednik użycia CONVERTz parametrem stylu 0.

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

Inne parametry stylu są dostępne CONVERTdla różnych wymagań, jak wspomniano w innych odpowiedziach.

Martin Smith
źródło
38
TA ODPOWIEDŹ NIE JEST PRAWIDŁOWA. Przetestowałem to na stole z identyfikatorami SID użytkownika - ilość rzucanych wartości Distinct jest mniejsza niż liczba Distinct binarnych SIDów. Powinieneś użyć CONVERT (VARCHAR (...), binaryValue, 2), aby uzyskać unikalną wartość - odpowiedź od Gunjana Juyala jest właściwa - powinna być oznaczona jako rozwiązanie
Philipp Munin
13
@PhilippMunin - Te dwie odpowiedzi mają różne znaczenie. Ten bierze wynik wyrażenia, takiego jak, SELECT CAST('This is a test' AS VARBINARY(100))które znajduje się 0x5468697320697320612074657374w moim domyślnym sortowaniu i konwertuje go z powrotem na varcharciąg. Odpowiedź Gunjana zwraca reprezentację szesnastkową jako ciąg ('5468697320697320612074657374'). Przypuszczalnie ta interpretacja jest poprawna dla potrzeb OP, ponieważ ją zaakceptowali.
Martin Smith
8
TA ODPOWIEDŹ JEST PRAWIDŁOWA! Przetestowałem to i robi to, czego ja i OP sobie życzyliśmy.
Ronnie Overby
1
@BIDeveloper Jeśli przeczytałeś powyższe komentarze (szczególnie mój), powinieneś zdać sobie sprawę, że problem polega na tym, że „konwersję varbinary na varchar” można interpretować na różne sposoby. Rzeczywiście, dlatego CONVERTma parametr stylu, aby wybrać sposób, w jaki chcesz (moja interpretacja jest stylem domyślnym). Więc ta odpowiedź może nie być tym, czego potrzebujesz w danym przypadku, ale jest poprawna dla innych przypadków użycia. Włącznie z pytającym, który określił „formę czytelną dla człowieka”, a nie szesnastkowy.
Martin Smith
1
SQL 2005 możesz użyć sys.fn_sqlvarbasetostr (@binary), ponieważ CONVERT będzie dla mnie puste
TheNerdyNerd
152

Działało dla mnie następujące wyrażenie:

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

Oto więcej szczegółów na temat wyboru stylu (trzeci parametr).

Gunjan Juyal
źródło
1
Zgodnie z opisem @ lara-mayugba poniżej, styl 1 zawiera przedrostek 0x na wyniku, co może być przydatne.
Stan
@celerno, dlaczego mieliby to robić? To nie robi tego, czego potrzebowali.
Martin Smith
1
Przed 2008 użyj sys.fn_sqlvarbasetostr (@binaryfield)
TheNerdyNerd
@metabuddy - w jakim sensie jest to dezinformacja? Stwierdza, że ​​termin „Konwersja varbinary na varchar” może być wykonany na różne sposoby i jest to kontrolowane przez parametr style. Tylko dlatego, że parametr stylu w tej odpowiedzi nie jest tym, którego potrzebujesz w swoim przypadku (ale jest tym, który odpowiada na oryginalne pytanie), nie czyni go dezinformacją
Martin Smith
1
Aby podkreślić komentarz / odpowiedź @TheNerdyNerd, wyrażenie brzmiałoby: `select sys.fn_sqlvarbasetostr (@b) / * zwraca 0x5468697320697320612074657374 * / Zakładając, że jeden zmienia varchar (max) na varchar (8000), ponieważ przed 2008 r. Go nie używa .
Zachary Scott
65

Właściwie najlepsza odpowiedź brzmi

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

użycie " 2" odcina " 0x" na początku varbinary.

Lara Mayugba
źródło
@BojieShuai Czy chodziło Ci o „Zgadzam się tak bardzo, że nie mogę zgodzić się jeszcze bardziej” lub „Zwykłem się zgadzać, ale już tego nie robię”?
howcheng
@howcheng Mam na myśli „nie mogę się bardziej zgodzić”. Dziękuję za zwrócenie uwagi.
Bojie Shuai
15

Spróbuj tego

SELECT CONVERT(varchar(5000), yourvarbincolumn, 0)
dmajkic
źródło
6
Musiałem użyć 2 jako mojego trzeciego parametru zamiast zera. Znalazłem tę odpowiedź tutaj .
WEFX
1
w moim przypadku muszę użyć MAX zamiast 5000
sulaiman sudirman
0

W przypadku VARBINARY(MAX)kolumny musiałem użyć NVARCHAR(MAX):

cast(Content as nvarchar(max))

Lub

CONVERT(NVARCHAR(MAX), Content, 0)
VARCHAR(MAX) didn't show the entire value
kristoffer_o
źródło
0

Próbowałem tego, zadziałało dla mnie:

declare @b2 VARBINARY(MAX) 
set @b2 = 0x54006800690073002000690073002000610020007400650073007400
SELECT CONVERT(nVARCHAR(1000), @b2, 0);
Bala
źródło
0

Spróbuj poniżej, ponieważ zmagałem się ze zbyt oryginalnym postem [Tutaj] [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]: /programming/60525910/powershell-truncating-sql-query-output?noredirect=1#comment107077512_60525910
żebro
źródło