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

StackOverflow https://stackoverflow.com/questions/68677

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Ожидаемый:

0x12345678

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

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

Обновить:Это не единственное значение в строке, поэтому я не могу просто НАПЕЧАТАТЬ @binvalue .Это что-то больше похожее на ПЕЧАТЬ "других вещей" + ????+ Еще кое-что".Не уверен, что это что-то меняет:Я не пробовал просто ПЕЧАТАТЬ @binvalue само по себе.

Это было полезно?

Решение

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

print master.sys.fn_varbintohexstr(@binvalue)

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

Другие советы

Не используйте 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 секунды.

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

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

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

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

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

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'

Я наткнулся на этот вопрос, когда искал решение аналогичной проблемы при печати шестнадцатеричного значения, возвращаемого функцией '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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top