Битовая маска TSQL vbinary с правым оператором varbinary

Я ищу некоторые подсказки или приемы для этой дизайнерской задачи, с которой я сталкиваюсь:

Мне нужно замаскировать два поля varbinary одинакового размера, хранящиеся в базе данных. Просто чтобы уточнить, нет, это не «таблица разрешений» или что-то в этом роде. Я бы нормализовал базу данных для таких элементов, а эти данные не могут быть нормализованы. Я храню поле varbinary для динамического хранения битов, которые генерирует наше приложение. Я также ищу эти биты с помощью другого запроса varbinary. В .net я использую тип BigInteger для обработки всех битовых масок, и он отлично справляется со своей задачей, однако я думаю о том, чтобы перенести этот процесс на сервер базы данных, чтобы отфильтровать результаты, прежде чем передать их обратно вызывающей стороне. Прямо сейчас я поддерживаю тип поля до varbinary(512) и захочу использовать операторы AND и OR и иметь возможность сравнить, сделал ли это ЛЮБОЙ (OR) или ВСЕ (AND) биты в правостороннем операторе. через. MSDN говорит, что вы можете использовать varbinary() с правым оператором max bigint, однако мне нужно превысить это.

Хороший ресурс, который я нашел, - это сообщение в блоге Адама Маханика по этой теме, но я хочу посмотреть, есть ли другие подходы, прежде чем я буду копаться в нем.

http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/bitmask-handling-part-3-logical-operators.aspx

Это будет для SQL 2005 или выше. Если в 2008 году есть функция, не найденная в 2005 году, меня это устраивает, просто я еще не смог ее идентифицировать.

Любые подсказки или уловки приветствуются.

Спасибо.

Трэвис Уидден


person TravisWhidden    schedule 23.01.2012    source источник
comment
Мне все еще любопытен этот ответ, но пока я создал функцию CLR в SQL для выполнения операций маскирования битов, которые я хотел протестировать.   -  person TravisWhidden    schedule 23.01.2012
comment
Хранение битовых масок в SQL Server в качестве поля, по которому вы хотите выполнить фильтрацию, — не лучшая идея, поскольку это поиск, который нельзя индексировать. (так что сканирование таблицы для каждого поиска). Лично я бы разгрузил сопоставление на сервер приложений и использовал бы сервер базы данных для запросов, которые могут быть оптимизированы регулятором запросов.   -  person Filip De Vos    schedule 03.02.2012
comment
Если BigInt работает в .NET, то почему BigInt недостаточно велик в SQL?   -  person paparazzo    schedule 12.05.2012
comment
Судя по моему опыту работы с битовыми масками в SQL Server, у SQL нет хорошего способа справиться с этим, и производительность всегда будет ниже. Вам лучше использовать простую функцию CLR, которую вы создали, если вам абсолютно необходимо проверить битовую маску, но вы никогда не получите эффективного поиска по битовой маске, поскольку, как говорит Филип, она не может быть проиндексирована.   -  person Zhenny    schedule 25.05.2012
comment
Да, я закончил тем, что сделал для него тип CLR. На самом деле это было очень быстро и приемлемо.   -  person TravisWhidden    schedule 24.01.2013


Ответы (1)


Если вы знаете максимальную длину растрового изображения, вы МОЖЕТЕ распределить его по нескольким столбцам и замаскировать их по отдельности.

Хотя загрязняется очень быстро.

person Thomas Kejser    schedule 14.06.2012