Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2013, 16:54   #1
Bayazet
Форумчанин
 
Регистрация: 08.12.2008
Сообщений: 156
По умолчанию сдвиги и 16-тиричное числа в SQL Server 2008

добрый день, помогите разобраться.
мне необходимо в SQL-запросе реализовать следующую структуру:
PHP код:
Format('{%.4x-%.4x-%.4x-%.4x-000000000000}', [Val1 shr 16Val1 and $FFFFVal2 shr 16Val2 and $FFFF]); 
то ли голова кругом, толи лыжи не едут
до чего я дошел
SHR - логический сдвиг вправо. насколько я понял это можно заменить банальным делением на 16 с последующим округлением до целого:
ROUND(Val1 / 16, 0)
c Val1 and $FFFF тоже вроде все прозрачно: Val1 & 0xFFFF
итого строка в SQL-запросе
PHP код:
'{' CAST(ROUND(Val1/160) AS NVARCHAR(4)) + '-' CAST(Val1&0xFFFF AS NVARCHAR(4)) + '-' CAST(ROUND(Val2/160) AS NVARCHAR(4)) + '-' CAST(Val2&0xFFFF AS NVARCHAR(4)) + '-000000000000}'
но вот только итог не похож на то, что возвращает дельфи (Val1 = 15084, Val2 = 1)
{0-1-942-15084-000000000000} - в SQL Server
{0000-0001-0000-3AEC-000000000000} - Delphi


Подскажите, что я делаю не так?
Bayazet вне форума Ответить с цитированием
Старый 15.08.2013, 19:40   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1. Val1 shr 16 - это не деление на 16, а целое деление на 65536 и ROUND не нужен, результат и так int будет
2. В delphi результат будет
{0000-3AEC-0000-0001-000000000000}
а не
{0000-0001-0000-3AEC-000000000000}
3. Конвертировать int в hex-string можно с помощью CONVERT(varbinary, @i). Можно поиграться с 3-им параметром 1 или 2.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.08.2013, 23:56   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
необходимо в SQL-запросе реализовать следующую структуру:
Ну у зачем именно в Сиквеле? Это внутренняя операция, которая отражается только в хранимой процедуре, давая результат для подальшего расчета внутрь СУБД, или это нужно именно клиентской программе?
Я имею ввиду что может лучше не парится, а сделать это в Делфи?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.08.2013, 06:35   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Как я понимаю, часть проблемы в дополнении числа нулями слева, я дополняю нулями в сиквеле следующей функцией
Код:
RIGHT('000' + CAST(ISNULL(@Code, '') AS varchar), 3)
здесь переменная @Code - некое число (подойдёт и строка), 1-999, такая функция выдаст 001-999 (3 знака справа строки берет, и в результате дополненные 3 нуля в начале обеспечат дополнение)
Конверт в хекс уже сказали, по идее просто такой хекс (уже строку) подать сюда - дополнится нулями также.
phomm вне форума Ответить с цитированием
Старый 16.08.2013, 09:01   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

На 2000-ом попробовал, в нем CONVERT не работает как в 2008-ом, заменил на master.dbo.fn_varbintohexstr
Код:
DECLARE @Val1 int,
        @Val2 int
SET @Val1=15084
SET @Val2=1
SELECT '{'+UPPER(RIGHT(master.dbo.fn_varbintohexstr(@Val1/65536),4))+'-'+
           UPPER(RIGHT(master.dbo.fn_varbintohexstr(@Val1 & 0xFFFF),4))+'-'+
           UPPER(RIGHT(master.dbo.fn_varbintohexstr(@Val2/65536),4))+'-'+
           UPPER(RIGHT(master.dbo.fn_varbintohexstr(@Val2 & 0xFFFF),4))+'-'+'000000000000}'
Результат:
{0000-3AEC-0000-0001-000000000000}
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.08.2013 в 09:05.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SQL Server 2008 ULR SQL, базы данных 2 10.05.2013 11:38
SQL server 2008 sargez SQL, базы данных 2 28.10.2010 13:58
sql server 2008 Neymexa Помощь студентам 1 25.03.2010 13:13
MS SQL Server 2008 и Visual Studio 2008 C# (Как работать с БД?) cherw9!40k Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 14.01.2010 20:51
c# и sql server 2008 BattleMage SQL, базы данных 3 14.09.2009 20:28