Как я могу напечатать двоичное значение в виде шестнадцатеричного в TSQL?
-
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 строками:
select master.sys.fn_varbintohexstr(field) from table`
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