Подтвердить что ты не робот

Как я могу напечатать двоичное значение как hex в TSQL?

Я использую SQL Server 2000 для печати некоторых значений из таблицы с помощью PRINT. С большинством данных, отличных от строки, я могу использовать nvarchar для печати, но двоичные значения пытаются преобразовать, используя бит-представление символов. Например:

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)

Ожидаемое:

0x12345678

Вместо этого он печатает два символа тарабарщины.

Как распечатать значение двоичных данных? Есть ли встроенный или мне нужно катить самостоятельно?

Обновление: это не единственное значение в строке, поэтому я не могу просто PRINT @binvalue. Это нечто большее, чем PRINT N'other stuff '+???? + N'more stuff '. Не уверен, что это имеет значение: я не пытался просто PRINT @binvalue сам по себе.

4b9b3361

Ответ 1

Если вы были на Sql Server 2005, вы можете использовать это:

print master.sys.fn_varbintohexstr(@binvalue)

Я не думаю, что существует в 2000 году, поэтому, возможно, вам придется сворачивать свои собственные.

Ответ 2

Не используйте master.sys.fn_varbintohexstr - он ужасно медленный, недокументированный, неподдерживаемый и может исчезнуть в будущей версии SQL Server.

Если вам нужно преобразовать binary(16) в hex char, используйте

convert(char(34), @binvalue, 1)

Почему 34? потому что 16*2 + 2 = 34, то есть "0x" - 2 символа, плюс 2 символа для каждого char.

Мы попытались сделать 2 запроса в таблице с 200 000 строк:

  • select master.sys.fn_varbintohexstr(field)
    from table`
    
  • select convert(char(34), field, 1)
    from table`
    

первая работает 2 минуты, а вторая - 4 секунды.

Ответ 3

select convert(varchar(max), field , 1) 
from table

В using varchar(max) вам не придется беспокоиться о том, чтобы указать размер (вид).

Ответ 4

DECLARE @binvalue binary(4)
SET @binvalue = 0x61000000
PRINT @binvalue 
PRINT cast('a' AS binary(4))
PRINT cast(0x61 AS varchar)

Не бросать.

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

[Начать редактирование] Если вам понадобится напечатанное значение в строковой переменной, используйте функцию, предложенную Эриком Зи Бердом.

DECLARE @mybin1 binary(16)
DECLARE @s varchar(100)
SET @mybin1 = 0x098F6BCD4621D373CADE4E832627B4F6
SET @s = 'The value of @mybin1 is: ' + sys.fn_varbintohexsubstring(0, @mybin1,1,0)
PRINT @s

Если эта функция не находится в вашем распоряжении из-за версий сервера или потому, что ей нужны специальные разрешения, вы можете создать свою собственную функцию.

Чтобы узнать, как эта функция была реализована в выпуске SQL Server 2005 Express, вы можете выполнить:

sp_helptext 'fn_varbintohexsubstring'

Ответ 5

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

Я хочу преобразовать максимальное значение timestamp в varchar:

SELECT 
   CONVERT(
      varchar(50), 
      CAST(MAX(timestamp) AS varbinary(8)), 
      1) AS LastTS
FROM Users

Что возвращает:

LastTS
==================
0x000000000086862C

Примечание. Важно, чтобы вы использовали CONVERT для преобразования varbinary -> varchar. Использование CAST не будет работать:

SELECT 
   CAST(
      CAST(MAX(timestamp) AS varbinary(8)) 
      AS varchar(50) ) AS LastTS
FROM Users

будет обрабатывать двоичные данные как символы, а не шестнадцатеричные значения, возвращая пустую строку.

Отменить его

Чтобы преобразовать сохраненную шестнадцатеричную строку в метку времени:

SELECT CAST(CONVERT(varbinary(50), '0x000000000086862C', 1) AS timestamp)

Примечание. Любой код выпущен в общедоступном домене. Не требуется атрибуция.

Ответ 6

Я столкнулся с этим вопросом, ища решение подобной проблемы при печати шестнадцатеричного значения, возвращаемого функцией "hashbytes" в SQL Server 2005.

К сожалению, в этой версии SQL Server CONVERT не работает вообще, только fn_varbintohexsubstring делает правильную вещь:

Я сделал:

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT 'cast(@binvalue AS nvarchar): ' + CAST(@binvalue AS nvarchar)
PRINT 'convert(varchar(max), @binvalue, 0): ' + CONVERT(varchar(max), @binvalue, 0)
PRINT 'convert(varchar(max), @binvalue, 1): ' + CONVERT(varchar(max), @binvalue, 1)
PRINT 'convert(varchar(max), @binvalue, 2): ' + CONVERT(varchar(max), @binvalue, 2)
print 'master.sys.fn_varbintohexstr(@binvalue): ' + master.sys.fn_varbintohexstr(@binvalue)

Вот результат, который я получил в SQL Server 2005 (

cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 4Vx
convert(varchar(max), @binvalue, 2): 4Vx
master.sys.fn_varbintohexstr(@binvalue): 0x12345678

(там действительно непечатаемый символ перед "4Vx - я бы разместил изображение, но пока у меня недостаточно очков).


Изменить: просто для добавления SQL Server 2008 R2 проблема с CONVERT фиксируется следующим выходом:

cast(@binvalue AS nvarchar): 㐒硖
convert(varchar(max), @binvalue, 0): 4Vx
convert(varchar(max), @binvalue, 1): 0x12345678
convert(varchar(max), @binvalue, 2): 12345678
master.sys.fn_varbintohexstr(@binvalue): 0x12345678