powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите разобраться
12 сообщений из 12, страница 1 из 1
Помогите разобраться
    #40024203
Sviman144
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,

В БД (SQL2008R2) ест таблица, в которой есть столбец, пусть "flags", тип Integer.
При внесении изменений в таблицу триггером запускается процедура, в которой значениям в столбце присваивается новое значение через выражения вроде следующих:
If flags&0x0200=0
begin
Если выполняется условие такое-то, то:
flags = flags|0x00040004
иначе
flags = flags&0xfffffff7
end
... и т.д.

1. Подскажите, пожалуйста, в чем тайный смысл подобных манипуляций. В каких случаях используются именно такие присвоения (вместо конкретного значения)?
2. Как, в таком случае, определить нужные для результата запроса значения столбца, если потребуется сделать некую выборку по значению?
3. Если я правильно понимаю, то SQL преобразует два сравниваемых значения в двоичную систему и сравнивает побитно. В зависимости от типа сравнения получаем результирующее значение. Но непонятно, почему второе число задается в hex (если не ошибаюсь)?

Заранее благодарю за ответы...
...
Рейтинг: 0 / 0
Помогите разобраться
    #40024207
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sviman144,

Это битовый флаг для хранения кучи boolean'ов о одном инте и доступ к ним. Вроде как сейчас в СУБД есть поля, которые занимают 1 бит и такой изврат не нужен.

1. Смысл зависит от контекста и от того, что в этих битах хранится.
2. Через & ставишь нужное бинарное значение и получаешь наличие нужных тебе флагов.
3. А через что его задавать, если не через hex? Бинарное представление в mssql завезли? Даже если да, то оно не такое удобное. А тут 0х01 - первый бит, 0x02 - второй, 0x04 - третий, 0x08 - четвёртный и т.д. А еще можно делать сдвиги. Но лучше такое не использовать вообще, по понятной причине. Иллюзорный выигрыш нескольких байт не стоит того.
...
Рейтинг: 0 / 0
Помогите разобраться
    #40024209
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sviman144,

полагаю, что используются и сравниваются битовые маски, где каждая позиция имеет свой логический смысл
0010100100111011

а хранится в инт-е, что в данном случае равняется 10555
...
Рейтинг: 0 / 0
Помогите разобраться
    #40024217
Sviman144
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю за ответы.

Т.е. получается, чтобы получить в выборке нужные результаты", нужно как-то разобраться в этих "масках" (какой бит отвечает за нужный результат)? И кроме того, как сравнивать (через "и" или через "или")?

А если значение, например, трехзначное, допустим 902? Каким образом, программа побитно сравнивает его с тем же 0x00200020? Как-то "отсекается" все лишнее?

Пример:
select distinct flags from таблица
where flags = flags|0x00200020

Результат: 60 вариантов "флагов" (в том числе 2097184)

и

select * from таблица
where flags = flags&0x00200020

Результат: два варианта флагов 0 и 2097184.
...
Рейтинг: 0 / 0
Помогите разобраться
    #40024222
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sviman144,

почитайте
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/bitwise-operators-transact-sql

https://www.mssqltips.com/sqlservertip/1218/sql-server-bitwise-operators-to-store-multiple-values-in-one-column/

кроме того, можно использовать calc.exe для конвертирования между HEX, DEC & BIN
...
Рейтинг: 0 / 0
Помогите разобраться
    #40024272
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sviman144,

РСУБД - худшее место для битовых масок.
Имхо )
...
Рейтинг: 0 / 0
Помогите разобраться
    #40024289
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критик
Sviman144,

РСУБД - худшее место для битовых масок.
Имхо )
С другой стороны, делать 60 полей типа bit тоже не очень :-)
...
Рейтинг: 0 / 0
Помогите разобраться
    #40024324
Sviman144
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все равно не получается определить "контекст", по которому устанавливаются те или иные значения.
Ок, спасибо за ответы и ссылки...

Тему можно считать закрытой.
...
Рейтинг: 0 / 0
Помогите разобраться
    #40024326
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Критик
Sviman144,

РСУБД - худшее место для битовых масок.
Имхо )
С другой стороны, делать 60 полей типа bit тоже не очень :-)
а кто потом вспомнит, что признак "наличие длинных волос в левой подмышке" лежит в 45-м бите?
...
Рейтинг: 0 / 0
Помогите разобраться
    #40024347
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andreymx
а кто потом вспомнит, что признак "наличие длинных волос в левой подмышке" лежит в 45-м бите?

Ну, знают же люди, что, например, в AD в атрибуте userAccountControl седьмой бит показывает, что у учетки не истекает срок действия пароля. Так и здесь - в документации описывать это нужно.
...
Рейтинг: 0 / 0
Помогите разобраться
    #40024432
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
седьмой бит

пардон, 17-й
...
Рейтинг: 0 / 0
Помогите разобраться
    #40024444
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Сон Веры Павловны
седьмой бит
пардон, 17-й
вот именно )))
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите разобраться
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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