Как я могу напечатать двоичное значение как шестнадцатеричное в TSQL? - PullRequest
32 голосов
/ 16 сентября 2008

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

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

Ожидаемое:

0x12345678

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

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

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

Ответы [ 6 ]

40 голосов
/ 18 августа 2012

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

Если вам нужно преобразовать binary(16) в шестнадцатеричный символ, используйте convert:

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

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

Мы попытались сделать 2 запроса к таблице с 200000 строками:

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

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

29 голосов
/ 16 сентября 2008

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

print master.sys.fn_varbintohexstr(@binvalue)

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

21 голосов
/ 23 сентября 2012
select convert(varchar(max), field , 1) 
from table

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

5 голосов
/ 30 июля 2013

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

Я хочу преобразовать самое высокое значение 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)

Примечание : любой код публикуется в открытом доступе. Указание авторства не требуется.

3 голосов
/ 16 сентября 2008
DECLARE @binvalue binary(4)
SET @binvalue = 0x61000000
PRINT @binvalue 
PRINT cast('a' AS binary(4))
PRINT cast(0x61 AS varchar)

Не разыгрывать.

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

[Начать редактировать] Если вам нужно печатное значение в строковой переменной, используйте функцию, предложенную Eric Z Beard.

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 edition, вы можете выполнить:

sp_helptext 'fn_varbintohexsubstring'
2 голосов
/ 16 октября 2013

Я сталкивался с этим вопросом, когда искал решение аналогичной проблемы при печати шестнадцатеричного значения, возвращенного функцией «хэш-байты» в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...