Prenez ce scénario: Vous avez quelques énumérations de drapeaux en C# liées à (et en fait générées à partir de) tables Enum-ish dans SQL Server. Supposons que vous êtes un distributeur et que vous autorisiez vos revendeurs à spécifier les États américains auxquels ils livrent. Être un ingénieur logiciel brillant et élégant, vous mis en œuvre ces comme une valeur de drapeau-combinables pour bitwise sauver stockage:Simule un entier non signé de 128 bits dans SQL et C# en utilisant une valeur signée 64 bits?
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
Sweet. Vous pouvez inclure/exclure dynamiquement à la fois dans SQL et C# en utilisant la logique bit à bit, ce qui vous permet d'hydrater instantanément les listes de cases à cocher et de sélectionner des listes dans Asp.NET tout en n'enregistrant qu'un seul nombre de 64 bits. Et vous n'avez pas besoin d'un opérateur de comparaison non indexable dans les clauses WHERE de vos procédures, sauf par rapport à la table enum elle-même qui a un maximum de 64 lignes. La recherche de vos distributeurs pour tous ceux qui expédient vers l'Indiana et la Californie peut toujours utiliser une comparaison d'égalité et un index.
Vous avez maintenant une demande d'ajout de soutien pour les territoires américains, les codes postaux des forces armées et les provinces canadiennes, et ce, d'une manière rétrocompatible. Il n'y a pas de réduction de la liste à < 64 entrées, et l'entreprise vraiment veut éviter d'avoir à séparer les États de la vieille école du reste des territoires et des divisions.
Que faites-vous? Les réponses créatives sont appréciées, mais le véritable défi est le suivant: existe-t-il un moyen de forcer le même calcul binaire qui fonctionne sur des valeurs 64 bits non signées à travailler sur des valeurs signées tout en utilisant l'espace négatif pour dépasser 64 bits possibles , en C# et en SQL (2008)? Si c'est important, le drapeau est simulé, pas un drapeau "réel", donc techniquement il n'est pas nécessaire que cela fonctionne contre une énumération CLR avec l'attribut [Flags].
Combinaisons oui, mais dans ce cas, une combinaison est comme un navire vers l'Indiana et la Californie, pas un seul État. De toute façon peut-être pourriez-vous essayer d'utiliser des GUID? Ils sont en fait des entiers de 128 bits. – kubal5003
L'espace négatif est l'un des 64 bits, donc non. – Joe
J'ai rencontré exactement le même problème. Comment utilisez-vous un GUID pour stocker des numéros? – arao6