Возьмите этот сценарий: у вас есть несколько перечислений флагов в C#, связанных с (и фактически сгенерированными) таблицами Enum-ish в SQL Server. Скажите, что вы являетесь дистрибьютором, и вы разрешаете своим реселлерам указывать, в какие штаты США они отправляются. Будучи блестящим и элегантным инженером программного обеспечения, вы реализуете их в качестве значения флага побитового комбинируемых, чтобы сохранить память:Имитировать 128-разрядное целое число без знака в SQL и C# с использованием 64-разрядного знакового значения?
create table USState (
StateID bigint, StateAbbr char(2), StateName varchar(50))
/* insert all US States + DC into USState, StateIDs must be in powers of two */
/* StateID 0 reserved for 'None': */
create procedure GetStatesByFlag (@StateFlags bigint) as
declare @StateIDs table
(
StateID bigint,
primary key (StateID)
)
insert into @StateIDs
select StateID
from USState
where @StateFlags & StateID != 0
or (@StateFlags = 0 and StateID = 0)
select s.StateID, s.StateAbbr, s.StateName
from
USState s join
@StateIDs si
on si.StateID = s.StateID
помадка. Вы можете включать/исключать динамически как в SQL, так и в C# с помощью побитовой логики, которая позволяет мгновенно убрать списки флажков и выбирать списки в Asp.NET, сохраняя при этом только одно 64-разрядное число, чтобы сохранить любую комбинацию выбранных. И вам не нужен неиндексируемый оператор сравнения в ваших процедурах. Предложения WHERE, за исключением самой таблицы перечислений, которая имеет максимум 64 строки. Поиск ваших дистрибьюторов для всех, кто отправляется в Индию и Калифорнию, по-прежнему может использовать сравнение равенства и индекс.
Теперь у вас есть просьба добавить поддержку территорий США, коды почтовых отправлений вооруженных сил и провинций Канады и сделать это в обратном порядке. Там нет резки списка до < 64 записей, а бизнес действительно хочет избежать необходимости отделять государства старой школы от остальной территории и подразделений.
Что вы будете делать?
Творческие ответы приветствуются, но настоящая проблема заключается в следующем: существует ли способ заставить одну и ту же побитовую математику, которая работает с 64-разрядными значениями без знака, работать на подписанных, используя отрицательное пространство, чтобы превысить 64 возможных бита , как в C#, так и в SQL (2008)? Если это имеет значение, флаг моделируется, а не «реальный» флаг, поэтому технически не обязательно, чтобы это работало против перечня CLR с атрибутом [Flags].
Комбинации да, но в этом случае комбинация похожа на корабль в Индиану и Калифорнию, а не на одно государство. В любом случае, возможно, вы можете попробовать использовать GUID? Они на самом деле 128-битные целые числа. – kubal5003
Негативное пространство - это только один из 64 бит, поэтому нет. – Joe
Я столкнулся с той же проблемой. Как вы используете идентификатор GUID для хранения чисел? – arao6