powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / varchar -> binary
25 сообщений из 34, страница 1 из 2
varchar -> binary
    #32059203
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Субж. Наоборот знаю, а вот именно так что-то не соображу.

Есть строка '0x1234'. Получить из нее binary-значение 0x1234.
...
Рейтинг: 0 / 0
varchar -> binary
    #32059210
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подойдет ?

Код: plaintext
1.
2.
3.
4.
5.
6.
declare @var1 binary( 5 )
declare @mysql nvarchar( 4000 )
set @mysql = 'set @var1 = '+'0x1234'

select @var1
exec sp_executesql @mysql, N'@var1 binary(5) out', @var1 = @var1 out
select @var1
...
Рейтинг: 0 / 0
varchar -> binary
    #32059227
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таким способом понятно, что можно :-) А не через динамический запрос никак-никак?
...
Рейтинг: 0 / 0
varchar -> binary
    #32059253
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот заготовка, ее нужно доработать...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
create function dbo.varchartovarbin( @string varchar( 8000 ) )
returns varbinary( 100 )
as
begin

declare @i int, @val binary, @result varbinary( 100 ), @length int

set @i =  3 
set @result =  0 

select @length = len(@string)

 -- validation of params
 
if @length < 4  or @length %  2  <>  0   or substring(@string,  1 ,  2 ) <> '0x' or @string is null return  0 


while (@i<@length)
begin

select @val = 
      (case substring(@string, @i,  1 )
       when '0' then  0 
       when '1' then  1 
       when '2' then  2 
       when '3' then  3 
       when '4' then  4 
       when '5' then  5 
       when '6' then  6 
       when '7' then  7 
       when '8' then  8 
       when '9' then  9 
       when 'A' then  10 
       when 'B' then  11 
       when 'C' then  12 
       when 'D' then  13 
       when 'E' then  14 
       when 'F' then  15 
       else - 1 
       end) *  16 
+
       case substring(@string, @i+ 1 ,  1 ) 
       when '0' then  0 
       when '1' then  1 
       when '2' then  2 
       when '3' then  3 
       when '4' then  4 
       when '5' then  5 
       when '6' then  6 
       when '7' then  7 
       when '8' then  8 
       when '9' then  9 
       when 'A' then  10 
       when 'B' then  11 
       when 'C' then  12 
       when 'D' then  13 
       when 'E' then  14 
       when 'F' then  15 
       else - 256 
       end

  set @result = @result + @val

  set @i = @i +  2 

end

return @result
end
go
select dbo.varchartovarbin('0x1234')
go
...
Рейтинг: 0 / 0
varchar -> binary
    #32059260
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это необходимо добавить перед set @result = @result + @val:

if @val < 0 return 0
...
Рейтинг: 0 / 0
varchar -> binary
    #32059287
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понятно. Ладно, спасибо большое всем!
...
Рейтинг: 0 / 0
varchar -> binary
    #32059415
Dwarf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
set nocount on
declare
@varchar varchar(100),
@hexstring char(16),
@result varbinary(100),
@i int,
@pow int

set @hexstring = '0123456789ABCDEF'
set @result = 0
set @pow = 0

set @varchar = '0x12340f0a'

set @i = len(@varchar)
while @i >= 3
begin
set @result = @result + (charindex(substring(@varchar, @i, 1), @hexstring) - 1) * power(16, @pow)
set @i = @i - 1
set @pow = @pow + 1
end
select @result
...
Рейтинг: 0 / 0
varchar -> binary
    #32059417
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GreenSunrise, а что Вы хотите сделать? У меня то же возникла эта задача. Правда я ее еще не начинал решать.
Теперь, наверное, время сэкономлю.
...
Рейтинг: 0 / 0
varchar -> binary
    #32059490
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача дурацкая и нужная только в качестве заплатки на время перехода от одной версии софта, который мы пишем, к другой. Нужна внутри коллектива разработчиков :-) Есть таблица, в которой хранится бинарное поле и процедура, куда передается строковое значение как раз в виде '0x1234'. Закатать в таблицу, ессно, надо в бинарном. Вот :-)

Вариант Glory меня вполне устраивает, эт я больше выпендриваюсь ;-) (вернее, пытаюсь выяснить на будущее, вдруг да пригодится в серьезной ситуации).

2 Dwarf: а у вас результат выполнения какой-то странноватый... 0x12340F0A. Для вашего примера хотелось увидеть 0x0123456789ABCDEF.
...
Рейтинг: 0 / 0
varchar -> binary
    #32059493
Фотография Тимур
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так не пробовали ? :0)
Код: plaintext
1.
2.
3.
4.
5.
declare  @Bin varbinary ( 10 )
declare  @Ch varchar ( 10 )
select @Ch='0x123456'
select @Bin=cast(@Ch as varbinary( 10 ))
select @Bin



Документацию читают только ламеры ??????
...
Рейтинг: 0 / 0
varchar -> binary
    #32059497
mishgan2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 (Тимур)
И в результате будет:
0x3078313233343536
...
Рейтинг: 0 / 0
varchar -> binary
    #32059510
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тимур, а ответы пишут только торопыжки? :-)
mishgan2000 - именно.
...
Рейтинг: 0 / 0
varchar -> binary
    #32059515
Rom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясните плиз такую вещь
в варианте от Glory
почему на выходе получаем 0x1234000000, т.е. 1234 она перенесла в старшие разряды, или так и должно быть ?
...
Рейтинг: 0 / 0
varchar -> binary
    #32059521
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В варианте Glory нужно заменить binary на varbinary, тогда дополнения нулями не будет.
...
Рейтинг: 0 / 0
varchar -> binary
    #32059545
GammiBear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DECLARE @Z varbinary(10)
declare @X int

EXEC xp_sscanf '0x12345F', '%lX', @X OUTPUT
SELECT @X

select @Z= cast(@X as varbinary(3))
select @Z

select @Z= cast(@X as varbinary(5))
select @Z

P.S.
Так все-таки : документацию читают только ламеры ???
...
Рейтинг: 0 / 0
varchar -> binary
    #32059551
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2GammiBear
На
Microsoft SQL Server 2000 - 8.00.679 (Intel X86) Aug 26 2002 15:09:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 3)

строка EXEC xp_sscanf '0x12345F', '%lX', @X OUTPUT
генерирует ошибку

Msg 50002, Level 1, State 50002
Error executing extended stored procedure: Invalid Parameter Type
...
Рейтинг: 0 / 0
varchar -> binary
    #32059554
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде бы уже много раз писали (в Books Online, в частности), что xp_sscanf, xp_sprintf работают только
со строками:

Currently only the %s format argument is supported.
...
Рейтинг: 0 / 0
varchar -> binary
    #32059565
GammiBear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Configuration :

Microsoft SQL Server 2000 Developer Edition + SP2 (Intel X86) + Win2K PROF RUS SP3

Все работает на ура.
...
Рейтинг: 0 / 0
varchar -> binary
    #32059566
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2GammiBear

Это потому, уважаемый GammiBear, что Вы игнорируете хотфиксы. Если бы Вы удосужились и установили фикс,
закрывающий дыру в xp_sprintf, то все бы не работало
(как и дОлжно быть).

Пришлите вывод select @@version
...
Рейтинг: 0 / 0
varchar -> binary
    #32059570
Dwarf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GreenSunrise: Результат тот, что нужно :) Посмотрите внимателно, что конвертится и для чего нужен @hexstring :)
...
Рейтинг: 0 / 0
varchar -> binary
    #32059576
GammiBear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Microsoft SQL Server 2000 - 8.00.534 (Intel X86) Nov 19 2001 13:23:50 Copyright (c) 1988-2000 Microsoft Corporation Developer Edition on Windows NT 5.0 (Build 2195: Service Pack 2)

P.S.

1. интересно сколько времени назад писался BOL?
2. Currently only ... supported лично я понимаю, что in future будет поддерживаться что-то еще
3. Интересный хотфикс получается, который гасит функциональность ...
4. Не понятно в чем бага , если sscanf понимает что-нибудь еще , кроме %s
...
Рейтинг: 0 / 0
varchar -> binary
    #32059580
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Dwarf: точно, извините за наезд :-) Возвращает то, что нужно.

Только ваш способ все равно не катит, потому что при чуть более длинных строках начинается Arithmetic overflow error.
...
Рейтинг: 0 / 0
varchar -> binary
    #32059582
Rom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, у меня не возникает никаких переполнений
...
Рейтинг: 0 / 0
varchar -> binary
    #32059583
Фотография Lexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для BOL выходил сервис пак, это не шутка
...
Рейтинг: 0 / 0
varchar -> binary
    #32059594
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О переполнениях.

Вместо
Код: plaintext
set @varchar = '0x12340f0a'
пишем
Код: plaintext
set @varchar = '0x0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF'
и привет.
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / varchar -> binary
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]