SQL Server преобразовывает varbinary в строку

Я хочу выполнить преобразование в T-SQL из типа varbinary в строковый тип

Вот пример:

Сначала получил это varbinary

0x21232F297A57A5A743894A0E4A801FC3

А затем я хочу преобразовать его в

21232f297a57a5a743894a0e4a801fc3

Как это сделать?


person strike_noir    schedule 27.08.2012    source источник
comment
Какая у вас версия SQL Server? Ответ Андраса работает, например, только с 2008 года или выше.   -  person Pondlife    schedule 27.08.2012
comment
Это правда, я обновил свой ответ, поэтому, если у вас более старая версия, вам нужно другое решение   -  person András Ottó    schedule 27.08.2012
comment
Возможный дубликат varbinary для строки на SQL Server   -  person    schedule 18.02.2016


Ответы (6)


Пытаться:

DECLARE @varbinaryField varbinary(max);
SET @varbinaryField = 0x21232F297A57A5A743894A0E4A801FC3;

SELECT CONVERT(varchar(max),@varbinaryField,2), 
@varbinaryField

ОБНОВЛЕНО: для SQL Server 2008

person András Ottó    schedule 27.08.2012
comment
Его также можно использовать при извлечении непосредственно из таблицы: SELECT CONVERT(VARCHAR(MAX), MyBinaryField, 2) FROM MyTable WHERE ID = 123456 - person Mustafa Çağatay Tulun; 09.01.2015
comment
Если вы хотите сохранить префикс «0x», используйте флаг стиля 1 в выражении CONVERT (вместо 2). SELECT CONVERT( VARCHAR(MAX), MyBinaryField, 1) FROM MyTable WHERE ID = 123456;. - person Graeme; 05.02.2015
comment
И как проверить это на наличие null inline? DECLARE @varbinaryField varbinary(max); SET @varbinaryField = 0x21232F297A57A5A743894A0E4A801FC3; SELECT CONVERT(varchar(max), ISNULL(@varbinaryField, 'value is NULL'), 2), @varbinaryField ошибка подъема Implicit conversion from data type varchar to varbinary(max) is not allowed. Use the CONVERT function to run this query. - person Jalal; 14.03.2015

Я знаю, что это старый вопрос, но вот альтернативный подход, который я считаю более полезным в некоторых ситуациях. Я считаю, что функция master.dbo.fn_varbintohexstr доступна в SQL Server по крайней мере с SQL2K. Добавляем его сюда для полноты картины. Некоторым читателям также может быть поучительно взглянуть на исходный код этой функции.

declare @source varbinary(max);
set @source = 0x21232F297A57A5A743894A0E4A801FC3;
select varbin_source = @source
,string_result = master.dbo.fn_varbintohexstr (@source)
person Craig.Feied    schedule 19.12.2013

Если вы хотите преобразовать одно значение VARBINARY в VARCHAR (STRING), вы можете сделать это, объявив такую ​​переменную:

DECLARE @var VARBINARY(MAX)
SET @var = 0x21232F297A57A5A743894A0E4A801FC3
SELECT CAST(@var AS VARCHAR(MAX))

Если вы пытаетесь выбрать из столбца таблицы, вы можете сделать следующее:

SELECT CAST(myBinaryCol AS VARCHAR(MAX))
FROM myTable
person Himanshu Jansari    schedule 27.08.2012
comment
По какой-то причине на SQL Server 2012 преобразование не работало, но Cast помогло ??? Спасибо! - person ConstantineK; 03.01.2015
comment
Простой CAST может не работать по умолчанию, поскольку шестнадцатеричное выражение преобразуется в ASCII / UNICODE. Используйте CONVERT с флагом стиля (1 или 2). - person Graeme; 05.02.2015

Это работает как в SQL 2005, так и в 2008:

declare @source varbinary(max);
set @source = 0x21232F297A57A5A743894A0E4A801FC3;
select cast('' as xml).value('xs:hexBinary(sql:variable("@source"))', 'varchar(max)');
person Kuba Wyrostek    schedule 27.08.2012
comment
Как сделать то же преобразование для поля, но не для переменной? - person ZedZip; 09.11.2012
comment
Чтобы сделать то же самое, но для столбца, а не для переменной, вы должны использовать функцию sql: column (technet.microsoft.com/en-us/library/ms191214.aspx). Таким образом, он будет приведен ('' как xml) .value ('xs: hexBinary (sql: column (someColumnNameHere))' - person Anssssss; 02.12.2013

Я везде искал ответ, и, наконец, у меня это сработало:

SELECT Lower(Substring(MASTER.dbo.Fn_varbintohexstr(0x21232F297A57A5A743894A0E4A801FC3), 3, 8000))

Вывод в (строка):

21232f297a57a5a743894a0e4a801fc3

Вы также можете использовать его в своих условиях WHERE или JOIN, если хотите сравнить / сопоставить записи varbinary со строками

person Walter R    schedule 02.06.2016
comment
Есть идеи, как обновить это поле обратно с помощью строки, повторно преобразованной обратно в varbinary? - person Frondor; 20.09.2016

Вот простой пример, который я написал для преобразования и обратного преобразования с помощью двух методов преобразования, я также проверил его с фиксированной строкой

объявить @ VB1 VARBINARY (500), @ VB2 VARBINARY (500), @ VB3 VARBINARY (500)

объявить @ S1 VARCHAR (500)

SET @ VB1 = HASHBYTES ('SHA1', 'Тест')

НАБОР @ S1 = ПРЕОБРАЗОВАТЬ (varchar (500), @ VB1,2)

НАБОР @ VB2 = ПРЕОБРАЗОВАТЬ (varbinary (500), @ S1,2)

SET @ VB3 = CONVERT (varbinary (500), '640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA', 2)

ВЫБРАТЬ @ VB1, @ S1, @ VB2, @ VB3

ЕСЛИ @ VB1 = @ VB2 ПЕЧАТЬ 'Они совпадают (2)'

IF @ VB1 = @ VB3 PRINT 'Они совпадают (3)'

PRINT str (Len (@ VB1))

PRINT str (Len (@ S1))

PRINT str (Len (@ VB2))

SET @ VB1 = HASHBYTES ('SHA1', 'Тест')

НАБОР @ S1 = ПРЕОБРАЗОВАТЬ (varchar (500), @ VB1,1)

НАБОР @ VB2 = ПРЕОБРАЗОВАТЬ (varbinary (500), @ S1,1)

ВЫБРАТЬ @ VB1, @ S1, @ VB2

IF @ VB1 = @ VB2 PRINT 'Они совпадают (1)'

PRINT str (Len (@ VB1))

PRINT str (Len (@ S1))

PRINT str (Len (@ VB2))

и выход

||| 0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA | 640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA | 0x640AB2BAE07BEDC4C4C163F679A746F3AB7AB2FBA7FBA7FB2FA7FB2FB2A07FB2FB07C07FB2A07C07FB08C07FB2C07C07FB2C07FB0C08

(Затронута 1 строка (и))

Они совпадают (2)

Они совпадают (3)

    20
    40
    20

|| 0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA | 0x640AB2BAE07BEDC4C163F679A746F7AB7FB5D1FA | 0x640AB2BAE07BEDC4C163F679A7465F1FA7F

(Затронута 1 строка (и))

Они совпадают (1)

    20
    42
    20
person Brian    schedule 27.02.2017