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

Откуда:
Сообщений: 8
есть запрос к некой таблице @tableName (справочник 1С) у которой есть значения в виде as binary(16) - guid, в параметр запроса к ней передается Guid элемента, значение которого храниться в текстовом файлике на диске, вопрос как найти значение binare в табличке по "представлению" в тексте

--Обозначим переменные

declare @newRef varchar(100)
declare @BinRef binary(16)
declare @castRef varchar(100)
declare @oldRef varchar(36)

--вот это в файлике
--519052a5-3414-11e0-acd4-d733ec953e36
--0xacd4d733ec953e3611e03414519052a5

--получаем во временную таблицу (тип колонок varchar(100)) - тут упростим и назначим ---переменную
set @castRef = '0xacd4d733ec953e3611e03414519052a5'

--выполним искомое преобразование
set @BinRef = cast(@castRef as binary(16))

--посмотрим
select @BinRef
--получим 0x30786163643464373333656339353365, а надо 0xACD4D733EC953E3611E03414519052A5
--так как в табличке guid в том же виде 0xACD4D733EC953E3611E03414519052A5 только значение binare.

--Как доп информация - запрос еще собирается динамически ключевая строка будет вида:
set @sql = 'update '+ @tableName +' set '+ @columnName = @newRef + ' where '+ @columnName + @oldRef
exec(@sql)

Я новичок вроде вопрос простой перекопал и bol и форум не могу решение найти
18 окт 11, 23:14    [11463135]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать guid из текста в параметр для запроса как binare  [new]
iljy
Member

Откуда:
Сообщений: 8711
prostoyvopros,

select CAST('519052a5-3414-11e0-acd4-d733ec953e36' as uniqueidentifier)

select cast(CAST('519052a5-3414-11e0-acd4-d733ec953e36' as uniqueidentifier) as binary(16))

select convert(binary(16), '0xacd4d733ec953e3611e03414519052a5',1)
19 окт 11, 00:27    [11463363]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать guid из текста в параметр для запроса как binare  [new]
prostoyvopros
Member

Откуда:
Сообщений: 8
iljy,

set @castRef = '519052a5-3414-11e0-acd4-d733ec953e36'
--set @oldRef = '0xacd4d733ec953e3611e03414519052a5'

set @Ref = cast(@castRef as uniqueidentifier)

получим 0xA55290511434E011ACD4D733EC953E36, а надо 0xacd4d733ec953e3611e03414519052a5
мож как то исходнужю строку переставить цифры местами?
19 окт 11, 19:08    [11468840]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать guid из текста в параметр для запроса как binare  [new]
iljy
Member

Откуда:
Сообщений: 8711
prostoyvopros,

почему вы решили, что надо 0xacd4d733ec953e3611e03414519052a5? Вы знаете формат гуида?
19 окт 11, 19:10    [11468853]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать guid из текста в параметр для запроса как binare  [new]
aleks2
Guest
declare @t table(x varbinary(16))
declare @s varchar(100), @b varbinary(16)

set @s='0xacd4d733ec953e3611e03414519052a5'

insert @t
exec('select '+@s)

select @b=x from @t

select @b

PS. Можна обойтись sp_sqlexec. Или динамическим запросом.
19 окт 11, 19:23    [11468936]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать guid из текста в параметр для запроса как binare  [new]
prostoyvopros
Member

Откуда:
Сообщений: 8
iljy,

да я знаю в какой таблице и строке у меня в 1С храниться искомый гуид и я его могу посмотреть через select и соответственно он и сравнивается с тем который на диске в файлике
19 окт 11, 19:45    [11469030]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать guid из текста в параметр для запроса как binare  [new]
prostoyvopros
Member

Откуда:
Сообщений: 8
aleks2,

спасибо красивый вариант думаю смогу его использовать
19 окт 11, 19:46    [11469036]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать guid из текста в параметр для запроса как binare  [new]
iljy
Member

Откуда:
Сообщений: 8711
prostoyvopros,

если хранится гуид, то он преобразуется именно так, как я написал. Пожтому для начала разберитесь, где и что у вас хранится. И еще - сервер какой?
19 окт 11, 19:50    [11469048]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать guid из текста в параметр для запроса как binare  [new]
prostoyvopros
Member

Откуда:
Сообщений: 8
iljy,

да, про формат эти строки это и есть один и тотже обьект у которого guid приведен ниже просто представления разные

----519052a5-3414-11e0-acd4-d733ec953e36 этот формирует 1с
----0xacd4d733ec953e3611e03414519052a5 этот sql

из верхнего нижний получается путем нехитрого соединения подстрок
19 окт 11, 19:54    [11469063]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать guid из текста в параметр для запроса как binare  [new]
prostoyvopros
Member

Откуда:
Сообщений: 8
iljy,

тренируюсь на 2005 а рабочий 2008r2
19 окт 11, 19:57    [11469075]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать guid из текста в параметр для запроса как binare  [new]
iljy
Member

Откуда:
Сообщений: 8711
prostoyvopros,

вторую строку можно перобразовать в binary в 2008 без всякой динамики, я уже показал как. Далее,
declare @t table (x uniqueidentifier)

insert @t values('519052a5-3414-11e0-acd4-d733ec953e36')

select x, CAST(x as binary(16)) from @t
xb
519052A5-3414-11E0-ACD4-D733EC953E360xA55290511434E011ACD4D733EC953E36

Что полностью соответствует формату структуры GUID с порядком байт Little Endian.
typedef struct _GUID {
    unsigned long  Data1;
    unsigned short Data2;
    unsigned short Data3;
    unsigned char  Data4[ 8 ];
} GUID;
и абсолютно не соответствует тому, что написали вы. Поэтому спрошу еще раз: что у вас и в каком формате храниться?
19 окт 11, 20:11    [11469111]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать guid из текста в параметр для запроса как binare  [new]
prostoyvopros
Member

Откуда:
Сообщений: 8
iljy,

----519052a5-3414-11e0-acd4-d733ec953e36 вот это представление guid из апликухи 1С

----0xacd4d733ec953e3611e03414519052a5 а это guid в binare (16) из sql

в файлик на диск пишуться оба, искать пробую 0xacd4d733ec953e3611e03414519052a5 так как он на sql, но могу предположить что поскольку апликуха 1с гуид формирует по какимто алгоритмам то это и на sql можно сделать что нить с 519052a5-3414-11e0-acd4-d733ec953e36 дабы получить binare (16), поэтому и в вопросе про него есть. я tsql начал недавно изучать поэтому привел мах исх данных,
19 окт 11, 21:05    [11469244]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать guid из текста в параметр для запроса как binare  [new]
iljy
Member

Откуда:
Сообщений: 8711
prostoyvopros,

сделать можно конечно, просто байты перетасовать, но зачем? Если у вас есть представление непосредственно бинарника, то используйте его и не мучайтесь. Никакая динамика кстати не нужна, обновите свой серве разработки. Оно и полезнее будет.
19 окт 11, 21:10    [11469257]     Ответить | Цитировать Сообщить модератору
 Re: Преобразовать guid из текста в параметр для запроса как binare  [new]
prostoyvopros
Member

Откуда:
Сообщений: 8
iljy,

да теперь незачем конечно, бинар и буду сравнивать

спасибо всем за участие и помощь, хороший живой форум, можно закрывать тему
19 окт 11, 21:18    [11469288]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить