varbinary to string di SQL Server

94

Bagaimana cara mengonversi nilai kolom dari varbinary(max)menjadi varchardalam bentuk yang dapat dibaca manusia?

Bilgin Kılıç
sumber
3
saya ingin varchar karena nilainya dipisahkan dari nilai string .. Maksud saya membaca apa yang tertulis ..
Bilgin Kılıç
@MartinSmith ppl mendorong saya untuk berubah. Jadi tandai kembali jawaban Anda. terima kasih atas komentar baik Anda.
Bilgin Kılıç
Orang-orang tampaknya menemukan ini dari mesin telusur dan berdasarkan pemungutan suara, parameter gaya 2 tampaknya lebih umum diperlukan, tetapi ini tidak memenuhi persyaratan awal Anda
Martin Smith

Jawaban:

88

"Mengubah a varbinarymenjadi varchar" bisa memiliki arti yang berbeda.

Jika varbinary adalah representasi biner dari string di SQL Server (misalnya dikembalikan oleh casting untuk varbinarylangsung atau dari DecryptByPassPhraseatau DECOMPRESSfungsi) Anda hanya bisa CASTitu

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

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

Ini sama CONVERTdengan menggunakan dengan parameter gaya 0.

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

Parameter gaya lain tersedia dengan CONVERTuntuk persyaratan yang berbeda seperti yang dicatat dalam jawaban lain.

Martin Smith
sumber
38
JAWABAN INI TIDAK BENAR. Saya mengujinya di atas meja dengan SID pengguna - jumlah nilai yang dicor Berbeda kurang dari jumlah SID biner Berbeda. Anda harus menggunakan CONVERT (VARCHAR (...), binaryValue, 2) untuk mendapatkan nilai unik - jawaban dari Gunjan Juyal benar - harus ditandai sebagai solusi
Philipp Munin
13
@PhilippMunin - Kedua jawaban tersebut memiliki fungsi yang berbeda. Yang ini mengambil hasil dari ekspresi seperti SELECT CAST('This is a test' AS VARBINARY(100))yang ada 0x5468697320697320612074657374di pemeriksaan default saya dan mengubahnya kembali ke varcharstring. Jawaban Gunjan mengembalikan representasi hex sebagai string ('5468697320697320612074657374') Agaknya interpretasi ini benar untuk kebutuhan OP karena mereka menerimanya.
Martin Smith
8
JAWABAN INI BENAR! Saya mengujinya dan itu melakukan apa yang saya dan OP inginkan.
Ronnie Overby
1
@BIDeveloper Jika Anda telah membaca komentar di atas (khususnya komentar saya), Anda harus menyadari bahwa masalahnya adalah bahwa "mengubah varbinary ke varchar" dapat diartikan dengan cara yang berbeda. Memang inilah mengapa CONVERTmemiliki parameter gaya untuk memilih cara yang Anda inginkan (interpretasi saya adalah gaya default) Jadi jawaban ini mungkin bukan yang Anda butuhkan untuk kasus penggunaan Anda saat ini, tetapi benar untuk kasus penggunaan lain. Termasuk penanya asli yang menentukan "bentuk yang dapat dibaca manusia" bukan hex.
Martin Smith
1
SQL 2005 Anda dapat menggunakan sys.fn_sqlvarbasetostr (@binary) karena CONVERT akan kosong untuk saya
TheNerdyNerd
149

Ekspresi berikut berhasil untuk saya:

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

Berikut adalah detail lebih lanjut tentang pilihan gaya (parameter ketiga).

Gunjan Juyal
sumber
Seperti yang dijelaskan oleh @ lara-mayugba di bawah, gaya 1 menyertakan awalan 0x pada hasil yang dapat berguna ..
Stan
@celerno mengapa mereka? Ini tidak melakukan apa yang mereka butuhkan.
Martin Smith
1
Pra 2008 menggunakan sys.fn_sqlvarbasetostr (@binaryfield)
TheNerdyNerd
@metabuddy - dalam hal apa misinformasi itu? Ini menyatakan bahwa istilah "Mengubah varbinary menjadi varchar" dapat dilakukan dengan cara yang berbeda dan ini dikontrol oleh parameter gaya. Hanya karena parameter gaya dalam jawaban itu bukan yang Anda butuhkan untuk kasus Anda (tetapi yang menjawab pertanyaan asli) tidak membuatnya menjadi informasi yang salah
Martin Smith
Untuk menekankan komentar / jawaban @TheNerdyNerd, ekspresi akan menjadi `pilih sys.fn_sqlvarbasetostr (@b) / * mengembalikan 0x5468697320697320612074657374 * / Dengan asumsi satu perubahan varchar (max) menjadi varchar (8000) karena pra-2008 tidak menggunakannya .
Zachary Scott
63

Sebenarnya jawaban terbaik adalah

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

menggunakan " 2" memotong " 0x" di awal varbinary.

Lara Mayugba
sumber
@BojieShuai Apakah yang Anda maksud adalah "Saya sangat setuju sehingga tidak mungkin bagi saya untuk menyetujui lebih jauh", atau "Saya dulu setuju tetapi saya tidak lagi melakukannya"?
howcheng
@howcheng maksud saya "sangat setuju". Terima kasih telah menunjukkan hal ini.
Bojie Shuai
15

Coba ini

SELECT CONVERT(varchar(5000), yourvarbincolumn, 0)
dmajkic.dll
sumber
6
Saya harus menggunakan 2 sebagai parameter ketiga saya, bukan nol. Saya menemukan jawabannya di sini .
WEFX
1
dalam kasus saya, saya harus menggunakan MAX daripada 5000
sulaiman sudirman
0

Untuk VARBINARY(MAX)kolom, saya harus menggunakan NVARCHAR(MAX):

cast(Content as nvarchar(max))

Atau

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

Saya mencoba ini, itu berhasil untuk saya:

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

Silakan coba di bawah ini karena saya berjuang untuk posting yang terlalu asli [Disini] [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
sumber