Я хочу выполнить преобразование в T-SQL из типа varbinary
в строковый тип
Вот пример:
Сначала получил это varbinary
0x21232F297A57A5A743894A0E4A801FC3
А затем я хочу преобразовать его в
21232f297a57a5a743894a0e4a801fc3
Как это сделать?
Я хочу выполнить преобразование в T-SQL из типа varbinary
в строковый тип
Вот пример:
Сначала получил это varbinary
0x21232F297A57A5A743894A0E4A801FC3
А затем я хочу преобразовать его в
21232f297a57a5a743894a0e4a801fc3
Как это сделать?
Пытаться:
DECLARE @varbinaryField varbinary(max);
SET @varbinaryField = 0x21232F297A57A5A743894A0E4A801FC3;
SELECT CONVERT(varchar(max),@varbinaryField,2),
@varbinaryField
ОБНОВЛЕНО: для SQL Server 2008
SELECT CONVERT(VARCHAR(MAX), MyBinaryField, 2) FROM MyTable WHERE ID = 123456
- person Mustafa Çağatay Tulun; 09.01.2015
SELECT CONVERT( VARCHAR(MAX), MyBinaryField, 1) FROM MyTable WHERE ID = 123456;
.
- person Graeme; 05.02.2015
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)
Если вы хотите преобразовать одно значение VARBINARY
в VARCHAR
(STRING
), вы можете сделать это, объявив такую переменную:
DECLARE @var VARBINARY(MAX)
SET @var = 0x21232F297A57A5A743894A0E4A801FC3
SELECT CAST(@var AS VARCHAR(MAX))
Если вы пытаетесь выбрать из столбца таблицы, вы можете сделать следующее:
SELECT CAST(myBinaryCol AS VARCHAR(MAX))
FROM myTable
Это работает как в SQL 2005, так и в 2008:
declare @source varbinary(max);
set @source = 0x21232F297A57A5A743894A0E4A801FC3;
select cast('' as xml).value('xs:hexBinary(sql:variable("@source"))', 'varchar(max)');
Я везде искал ответ, и, наконец, у меня это сработало:
SELECT Lower(Substring(MASTER.dbo.Fn_varbintohexstr(0x21232F297A57A5A743894A0E4A801FC3), 3, 8000))
Вывод в (строка):
21232f297a57a5a743894a0e4a801fc3
Вы также можете использовать его в своих условиях WHERE или JOIN, если хотите сравнить / сопоставить записи varbinary со строками
Вот простой пример, который я написал для преобразования и обратного преобразования с помощью двух методов преобразования, я также проверил его с фиксированной строкой
объявить @ 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