2008-09-16 3 views
29

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

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

Ожидаемое:

0x12345678

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

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

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

ответ

30

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

print master.sys.fn_varbintohexstr(@binvalue) 

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

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

sp_helptext 'fn_varbintohexsubstring' 
+0

Но что, если мне нужно больше, чем просто двоичные данные о линия? Что делать, если мне нужно напечатанное значение в строковой переменной? Я уже знаю, что кастинг не работает. – Tadmas 2008-09-16 02:28:09

+0

См. Дополнительную информацию в ответе. – 2008-09-26 01:03:06

+0

В ролях не поддерживается аргумент «style» (= 1), например convert(). См. «Бинарные стили» для [Sql Server 2012] (http://msdn.microsoft.com/en-us/library/ms187928.aspx). Например. print convert (varchar (max), 0x61, 1) работает. – crokusek 2014-08-20 19:57:08

34

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

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

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 секунды.

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

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

3

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

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

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

2

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


Редактировать: Просто добавить - на 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 
Смежные вопросы