varbinary в строку на SQL Server

96

Как преобразовать значение столбца из varbinary(max)в varcharв удобочитаемую форму?

Билгин Кылыч
источник
3
я хочу varchar, так как значение было получено из строкового значения .. Я хочу прочитать то, что было написано ..
Билгин Кылыч
@MartinSmith ppl подтолкнет меня к переменам. Так что пометил свой ответ еще раз. спасибо за ваши добрые комментарии.
Билгин Кылыч
Люди, кажется, сталкиваются с этим из поисковых систем, и, судя по результатам голосования, параметр стиля 2 кажется более распространенным, но это не соответствует вашим первоначальным требованиям,
Мартин Смит

Ответы:

92

«Преобразование a varbinaryв a varchar» может означать разные вещи.

Если varbinary - это двоичное представление строки в SQL Server (например, возвращенное преобразованием varbinaryнапрямую или из функций DecryptByPassPhraseили DECOMPRESS), вы можете простоCAST его

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

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

Это эквивалент использования CONVERTс параметром стиля0 .

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

Другие параметры стиля доступны CONVERTдля различных требований, как указано в других ответах.

Мартин Смит
источник
38
ЭТОТ ОТВЕТ НЕПРАВИЛЬНЫЙ. Я тестировал его на таблице с пользовательскими SID - количество различных приведенных значений меньше, чем количество отличных двоичных SID. Вы должны использовать CONVERT (VARCHAR (...), binaryValue, 2), чтобы получить уникальное значение - ответ от Гунджана Джуяла является правильным - его следует пометить как решение
Филипп Мунин
13
@PhilippMunin - Два ответа делают разные вещи. Он принимает результат выражения, например, SELECT CAST('This is a test' AS VARBINARY(100))которое есть 0x5468697320697320612074657374в моем сопоставлении по умолчанию, и преобразует его обратно в varcharстроку. Ответ Гунджана возвращает шестнадцатеричное представление в виде строки ('5468697320697320612074657374'). Предположительно, эта интерпретация верна для потребностей OP, поскольку они ее приняли.
Мартин Смит
8
ЭТО ПРАВИЛЬНЫЙ ОТВЕТ! Я протестировал его, и он делает то, что хотел я и ОП.
Ронни Оверби
1
@BIDeveloper, если вы читали комментарии выше (в частности, мой), вы должны понимать, что проблема в том, что «преобразование varbinary в varchar» можно интерпретировать по-разному. В самом деле, именно поэтому CONVERTесть параметр стиля, позволяющий выбрать тот способ, который вы хотите (моя интерпретация - стиль по умолчанию). Таким образом, этот ответ может быть не тем, что вам нужно для вашего варианта использования на данный момент, но он верен для других вариантов использования. Включая первоначального спрашивающего, который указал "читабельную форму", а не шестнадцатеричный.
Мартин Смит
1
SQL 2005, вы можете использовать sys.fn_sqlvarbasetostr (@binary), так как CONVERT для меня будет пустым
TheNerdyNerd 03
152

У меня сработало следующее выражение:

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

Здесь подробнее о выборе стиля (третий параметр).

Гунджан Жуял
источник
1
Как описано ниже @ lara-mayugba, стиль 1 включает префикс 0x в результате, который может быть полезен ..
Стэн,
@celerno зачем им? Это не делает то, что им нужно.
Мартин Смит
1
До 2008 года использовалось sys.fn_sqlvarbasetostr (@binaryfield)
TheNerdyNerd 03
@metabuddy - что это за дезинформация? В нем говорится, что термин «Преобразование двоичного файла в переменную» может быть выполнен по-разному, и что они контролируются параметром стиля.
Мартин Смит
1
Чтобы подчеркнуть комментарий / ответ @TheNerdyNerd, выражение будет иметь вид `select sys.fn_sqlvarbasetostr (@b) / * returns 0x5468697320697320612074657374 * / Предполагая, что кто-то меняет varchar (max) на varchar (8000), потому что до 2008 года он не использовался .
Захари Скотт,
66

На самом деле лучший ответ

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

использование " 2" обрезает " 0x" в начале varbinary.

Лара Маюгба
источник
@BojieShuai Вы имели в виду «Я согласен настолько, что я не могу согласиться еще дальше» или «Раньше я соглашался, но больше не делаю этого»?
howcheng
@howcheng Я имею в виду "не могу с этим согласиться". Спасибо за указание на это.
Bojie Shuai
15

Попробуй это

SELECT CONVERT(varchar(5000), yourvarbincolumn, 0)
dmajkic
источник
6
Мне пришлось использовать в качестве третьего параметра 2 вместо нуля. Я нашел этот ответ здесь .
WEFX 02
1
в моем случае я должен использовать MAX вместо 5000
сулайман судирман 01
0

Для VARBINARY(MAX)столбца пришлось использовать NVARCHAR(MAX):

cast(Content as nvarchar(max))

Или

CONVERT(NVARCHAR(MAX), Content, 0)
VARCHAR(MAX) didn't show the entire value
kristoffer_o
источник
0

Я пробовал это, у меня это сработало:

declare @b2 VARBINARY(MAX) 
set @b2 = 0x54006800690073002000690073002000610020007400650073007400
SELECT CONVERT(nVARCHAR(1000), @b2, 0);
Бала
источник
0

Попробуйте следующее, так как я боролся со слишком оригинальным постом [Здесь] [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
ребра
источник