Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Из binary в varchar  [new]
barrabas
Member

Откуда: от махмуда
Сообщений: 10502
есть binary, скажем 0xB0D9D36C0273C84142DD74EBD19CF0DE, нужно получить строку B0D9D36C0273C84142DD74EBD19CF0DE

На SQL Server 2005, использовал

select convert(varchar(36), 0xB0D9D36C0273C84142DD74EBD19CF0DE, 2)
-------------------------------
B0D9D36C0273C84142DD74EBD19CF0DE

на 2000 серваке выдаn не то что мне нужно

автор
select convert(varchar(36), 0xB0D9D36C0273C84142DD74EBD19CF0DE, 2)
------------------------------------
°ЩУlsИABЭtлСњрЮ


Как добиться результата в 2000?
6 июн 12, 13:51    [12674331]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
barrabas, написать свою функцию перекодирования.
6 июн 12, 14:00    [12674403]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
kDnZP
barrabas, написать свою функцию перекодирования.
Зачем, когда она уже там есть? :)

fn_varbintohexstr
6 июн 12, 14:01    [12674416]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
barrabas
Member

Откуда: от махмуда
Сообщений: 10502
Гавриленко Сергей Алексеевич
kDnZP
barrabas, написать свою функцию перекодирования.
Зачем, когда она уже там есть? :)

fn_varbintohexstr

спасибо
6 июн 12, 14:05    [12674467]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
barrabas
Member

Откуда: от махмуда
Сообщений: 10502
Гавриленко Сергей Алексеевич
kDnZP
barrabas, написать свою функцию перекодирования.
Зачем, когда она уже там есть? :)

fn_varbintohexstr

А обратная
из строки 'B0D9D36C0273C84142DD74EBD19CF0DE' (ну или '0xB0D9D36C0273C84142DD74EBD19CF0DE') в binary?
6 июн 12, 14:11    [12674541]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Гавриленко Сергей Алексеевич
Зачем, когда она уже там есть? :)

fn_varbintohexstr

Я ее не вспомнил... Что-то по памяти отдаленно помнил, что в одну сторону можно, а в другую проблематично. Последний год с 2000 мало работаю.
6 июн 12, 14:11    [12674544]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
barrabas
Гавриленко Сергей Алексеевич
пропущено...
Зачем, когда она уже там есть? :)

fn_varbintohexstr

А обратная
из строки 'B0D9D36C0273C84142DD74EBD19CF0DE' (ну или '0xB0D9D36C0273C84142DD74EBD19CF0DE') в binary?
Конверт не берет?
6 июн 12, 14:15    [12674589]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
barrabas
Member

Откуда: от махмуда
Сообщений: 10502
Гавриленко Сергей Алексеевич
barrabas
пропущено...

А обратная
из строки 'B0D9D36C0273C84142DD74EBD19CF0DE' (ну или '0xB0D9D36C0273C84142DD74EBD19CF0DE') в binary?
Конверт не берет?

нет

select convert(varchar(36), 0xB0D9D36C0273C84142DD74EBD19CF0DE, 2) R1,
convert(binary(13), 'B0D9D36C0273C84142DD74EBD19CF0DE', 2) R2,
upper(substring(master.dbo.fn_varbintohexstr(0xB0D9D36C0273C84142DD74EBD19CF0DE),3,32)) R3


R1 R2 R3
------------------------------------ ---------------------------- --------------------------------
°ЩУlsИABЭtлСњрЮ 0x42304439443336433032373343 B0D9D36C0273C84142DD74EBD19CF0DE
6 июн 12, 14:17    [12674608]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
barrabas
Member

Откуда: от махмуда
Сообщений: 10502
barrabas
Гавриленко Сергей Алексеевич
пропущено...
Конверт не берет?

нет

select convert(varchar(36), 0xB0D9D36C0273C84142DD74EBD19CF0DE, 2) R1,
convert(binary(13), 'B0D9D36C0273C84142DD74EBD19CF0DE', 2) R2,
upper(substring(master.dbo.fn_varbintohexstr(0xB0D9D36C0273C84142DD74EBD19CF0DE),3,32)) R3


R1 R2 R3
------------------------------------ ---------------------------- --------------------------------
°ЩУlsИABЭtлСњрЮ 0x42304439443336433032373343 B0D9D36C0273C84142DD74EBD19CF0DE


convert(binary(13), '0xB0D9D36C0273C84142DD74EBD19CF0DE', 2) R2,
тоже не то 0x30784230443944333643303237
6 июн 12, 14:18    [12674619]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
У вас 16 байт в ваших бинарных данных.

З.Ы. НА 2008м ваш код конвертит нормально все. Покажите, что ли, версию вашего 2000го сервера.
6 июн 12, 14:23    [12674692]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Гавриленко Сергей Алексеевич
У вас 16 байт в ваших бинарных данных.

З.Ы. НА 2008м ваш код конвертит нормально все. Покажите, что ли, версию вашего 2000го сервера.

У 2000 нет соответствующих стилей для конвертации. Я жеж говорю - не все так просто.
6 июн 12, 14:28    [12674749]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
barrabas
Member

Откуда: от махмуда
Сообщений: 10502
нашел реализацию вроде работает

CREATE FUNCTION dbo.HexStrToVarBin(@hexstr VARCHAR(64)) 
RETURNS varbinary(16) 
AS 
BEGIN 
   DECLARE @hex CHAR(2), @i INT, @count INT, @b varbinary(64), @odd BIT, @start bit
   SET @count = LEN(@hexstr) 
   SET @start = 1
   SET @b = CAST('' AS varbinary(1)) 
   IF SUBSTRING(@hexstr, 1, 2) = '0x' 
       SET @i = 3 
   ELSE 
       SET @i = 1 
   SET @odd = CAST(LEN(SUBSTRING(@hexstr, @i, LEN(@hexstr))) % 2 AS BIT)
   WHILE (@i <= @count) 
    BEGIN 
       IF @start = 1 AND @odd = 1
       BEGIN
           SET @hex = '0' + SUBSTRING(@hexstr, @i, 1)
       END
       ELSE
       BEGIN
           SET @hex = SUBSTRING(@hexstr, @i, 2)
       END
       SET @b = @b + 
               CAST(CASE WHEN SUBSTRING(@hex, 1, 1) LIKE '[0-9]' 
                   THEN CAST(SUBSTRING(@hex, 1, 1) AS INT) 
                   ELSE CAST(ASCII(UPPER(SUBSTRING(@hex, 1, 1)))-55 AS INT) 
               END * 16 + 
               CASE WHEN SUBSTRING(@hex, 2, 1) LIKE '[0-9]' 
                   THEN CAST(SUBSTRING(@hex, 2, 1) AS INT) 
                   ELSE CAST(ASCII(UPPER(SUBSTRING(@hex, 2, 1)))-55 AS INT) 
               END AS binary(1)) 
       SET @i = @i + (2 - (CAST(@start AS INT) * CAST(@odd AS INT)))
       IF @start = 1
       BEGIN
           SET @start = 0
       END
    END 
    RETURN @b 
END 
GO  



версия Microsoft SQL Server Enterprise Edition 8.00.2039
6 июн 12, 14:28    [12674757]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
aleks2
Guest
WHILE (@i <= @count) 
    BEGIN 
       IF @start = 1 AND @odd = 1
       BEGIN
           SET @hex = '0' + SUBSTRING(@hexstr, @i, 1)
       END
       ELSE
       BEGIN
           SET @hex = SUBSTRING(@hexstr, @i, 2)
       END


Говнокод.
6 июн 12, 15:27    [12675467]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
Hex-строчки в binary можно еще переводить с помощью XQuery. Только не помню, был ли он в 2000, или только с 2005?
6 июн 12, 15:48    [12675781]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
aleks2
Guest
create function [dbo].[HexToBin](@hex as varchar(4000))
returns varbinary(2000)
as
begin
declare @r varbinary(2000), @h char(16), @i int
set @h='123456789ABCDEF'
set @r=cast('' as varbinary(1))
if LEN(@hex)%2=1 set @hex='0'+@hex
set @i=LEN(@hex)-1
while @i>0 begin
  set @r=convert(binary(1), CHARINDEX(SUBSTRING(@hex,@i,1), @h)*16+CHARINDEX(SUBSTRING(@hex,@i+1,1), @h))+@r
  set @i=@i-2
end
return @r
end
6 июн 12, 16:20    [12676139]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
barrabas
Member

Откуда: от махмуда
Сообщений: 10502
aleks2
create function [dbo].[HexToBin](@hex as varchar(4000))
returns varbinary(2000)
as
begin
declare @r varbinary(2000), @h char(16), @i int
set @h='123456789ABCDEF'
set @r=cast('' as varbinary(1))
if LEN(@hex)%2=1 set @hex='0'+@hex
set @i=LEN(@hex)-1
while @i>0 begin
  set @r=convert(binary(1), CHARINDEX(SUBSTRING(@hex,@i,1), @h)*16+CHARINDEX(SUBSTRING(@hex,@i+1,1), @h))+@r
  set @i=@i-2
end
return @r
end

ну да, в твоём варианте код лучше.
Возьму его, тот был первое что нашёл, проверил результат, а в коде даже не разбирался, тем более что в tsql не силён, спасибо
6 июн 12, 17:28    [12676834]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
Larchik
Guest
barrabas
aleks2
create function [dbo].[HexToBin](@hex as varchar(4000))
returns varbinary(2000)
as
begin
declare @r varbinary(2000), @h char(16), @i int
set @h='123456789ABCDEF'
set @r=cast('' as varbinary(1))
if LEN(@hex)%2=1 set @hex='0'+@hex
set @i=LEN(@hex)-1
while @i>0 begin
  set @r=convert(binary(1), CHARINDEX(SUBSTRING(@hex,@i,1), @h)*16+CHARINDEX(SUBSTRING(@hex,@i+1,1), @h))+@r
  set @i=@i-2
end
return @r
end

ну да, в твоём варианте код лучше.
Возьму его, тот был первое что нашёл, проверил результат, а в коде даже не разбирался, тем более что в tsql не силён, спасибо


declare @identS varchar(4000)
set @identS='0x00102000000000000000000000000000000000000000000000000000000002'

declare @ident binary(31)
select @ident=dbo.HexToBin(@identS);
-------------------------------------
0x00001020000000000000000000000000000000000000000000000000000000



Уважаемые знатоки помогите найти ошибку в коде, у меня SQL 2005 convert не подходит(
13 дек 12, 17:22    [13627639]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
Glory
Member

Откуда:
Сообщений: 104760
Larchik
Уважаемые знатоки помогите найти ошибку в коде, у меня SQL 2005 convert не подходит(

Функция называется HexToBin. А не BinCharToBin
13 дек 12, 17:24    [13627661]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
Larchik
Guest
Glory
Larchik
Уважаемые знатоки помогите найти ошибку в коде, у меня SQL 2005 convert не подходит(

Функция называется HexToBin. А не BinCharToBin


а применяется для переменных varchar и binary.... мне такую надо(
13 дек 12, 17:29    [13627690]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
Glory
Member

Откуда:
Сообщений: 104760
Larchik
а применяется для переменных varchar и binary.... мне такую надо(

И что дальше ?
Функция все равно переводит шестнадцатиричное число в бинарное.
13 дек 12, 17:30    [13627704]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
aleks2
Guest
declare @identS varchar(4000)
set @identS='0x00102000000000000000000000000000000000000000000000000000000002'
set @identS=substring(@identS, 3, 40000)

select dbo.HexToBin(@identS);
13 дек 12, 17:34    [13627742]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
Larchik
Guest
aleks2
declare @identS varchar(4000)
set @identS='0x00102000000000000000000000000000000000000000000000000000000002'
set @identS=substring(@identS, 3, 40000)

select dbo.HexToBin(@identS);




Спасибо, Alex, не сильна в бинарных и 16-х числах)
13 дек 12, 17:42    [13627800]     Ответить | Цитировать Сообщить модератору
 Re: Из binary в varchar  [new]
aleks2
Guest
Кстате, в функции есть ошипка @h char(16), а нада @h char(15). Иначе возможны чудеса с пробелом.

-- ПРИМЕЧАНИЕ: любой символ, кроме '123456789ABCDEF' трактуется как '0'
create function [dbo].[HexToBin](@hex as varchar(4000))
returns varbinary(2000)
as
begin
declare @r varbinary(2000), @h char(15), @i int
set @h='123456789ABCDEF'
set @r=cast('' as varbinary(1))
if LEN(@hex)%2=1 set @hex='0'+@hex
set @i=LEN(@hex)-1
while @i>0 begin
  set @r=convert(binary(1), CHARINDEX(SUBSTRING(@hex,@i,1), @h)*16+CHARINDEX(SUBSTRING(@hex,@i+1,1), @h))+@r
  set @i=@i-2
end
return @r
end
14 дек 12, 07:58    [13629755]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить