varbinary до рядка на SQL Server


94

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


3
я хочу varchar, оскільки значення було втрачено зі значення рядка .. Я маю на увазі прочитати написане ..
Bilgin Kılıç

@MartinSmith ppl штовхає мене до змін. Отже, позначте свою відповідь ще раз. дякую за ваші добрі коментарі.
Bilgin Kılıç

Люди, здається, стикаються з цим у пошукових системах, і на основі голосування параметр style 2 здається частіше необхідним, але це не відповідає вашим початковим вимогам
Мартін Сміт,

Відповіді:


88

"Перетворення а varbinaryв 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), щоб отримати унікальне значення - відповідь від Gunjan Juyal правильна - її слід позначити як рішення
Philipp Munin

13
@PhilippMunin - Ці дві відповіді роблять різні речі. Цей приймає результат виразу, наприклад, SELECT CAST('This is a test' AS VARBINARY(100))який міститься 0x5468697320697320612074657374у моєму порівнянні за замовчуванням, і перетворює його назад у varcharрядок. Відповідь Гунджана повертає шістнадцяткове подання у вигляді рядка ('5468697320697320612074657374'). Імовірно, таке трактування є правильним для потреби OP, оскільки вони його прийняли.
Martin Smith

8
ЦЕ ВІДПОВІДЬ ПРАВИЛЬНИЙ! Я протестував його, і він робить те, що я і ОП бажали.
Ронні Овербі

1
@BIDeveloper, якщо ви прочитали коментарі вище (зокрема, мій), ви повинні усвідомити, що проблема полягає в тому, що "перетворення varbinary в varchar" може тлумачитися по-різному. Насправді саме тому CONVERTпараметр стилю вибирає потрібний вам спосіб (моєю інтерпретацією є стиль за замовчуванням). Отже, ця відповідь може бути не тією, яка вам потрібна для вашого випадку використання на даний момент, але вона правильна для інших випадків використання. Включаючи оригінального допитувача, який вказав "читабельну форму", а не шістнадцяткову форму.
Мартін Сміт

1
SQL 2005, ви можете використовувати sys.fn_sqlvarbasetostr (@binary), оскільки CONVERT для мене буде порожнім
TheNerdyNerd 03.03.18

149

Для мене спрацював такий вираз:

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

Ось докладніше про вибір стилю (третій параметр).


Як описано нижче @ lara-mayugba, стиль 1 включає префікс 0x до результату, який може бути корисним ..
Стен

@celerno, чому б вони? Це робить не те, що їм потрібно.
Martin Smith

1
До 2008 року використовуйте sys.fn_sqlvarbasetostr (@binaryfield)
TheNerdyNerd 03.03.18

@metabuddy - в чому це дезінформація? У ній зазначається, що термін "Перетворення варбінарію у варчар" може виконуватися по-різному і що вони контролюються параметром style. Тільки тому, що параметр стилю у цій відповіді не той, який вам потрібен для вашої справи (але саме той, який відповідає на вихідне питання), не означає, що це дезінформація
Мартін Сміт,

Щоб підкреслити коментар / відповідь @TheNerdyNerd, вираз буде `select sys.fn_sqlvarbasetostr (@b) / * повертає 0x5468697320697320612074657374 * / Припускаючи, що один змінює varchar (max) на varchar (8000), оскільки до 2008 року його не використовувати .
Захарі Скотт,

63

Насправді найкраща відповідь

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

використання " 2" відсікає " 0x" на початку varbinary.


@BojieShuai Ви мали на увазі: "Я так згідний, що мені неможливо домовитись навіть далі", або "Я раніше погоджувався, але більше не роблю цього"?
howcheng

@howcheng Я маю на увазі "не можу більше погодитися". Дякуємо, що вказали на це.
Боджі Шуай,

15

Спробуйте це

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

6
Мені довелося використовувати 2 як третій параметр, а не нуль. Я знайшов цю відповідь тут .
WEFX

1
у моєму випадку мені доведеться використовувати MAX замість 5000
Сулейман Судірман

0

Для VARBINARY(MAX)стовпця мені довелося використовувати NVARCHAR(MAX):

cast(Content as nvarchar(max))

Або

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

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]: https://stackoverflow.com/questions/60525910/powershell-truncating-sql-query-output?noredirect=1#comment107077512_60525910
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.