Simuler un entier non signé de 128 bits # SQL et C en utilisant une valeur signée 64 bits?

StackOverflow https://stackoverflow.com/questions/1732780

Question

Prenez ce scénario: Vous avez quelques drapeaux énumérations en C # lié à (et en fait générés) par tables Enum-ish dans SQL Server. Dites que vous êtes un distributeur, et vous permettez à vos revendeurs de préciser ce que les États-Unis, ils embarquent à. Être un ingénieur logiciel brillant et élégant, vous mis en œuvre ces comme une valeur de drapeau-combinables pour bitwise sauvegarde de la mémoire:

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
Doux

. Vous pouvez inclure / exclure dynamiquement dans SQL et C # en utilisant la logique binaire, ce qui vous permet d'hydrater instantanément des listes de cases à cocher et sélectionnez les listes dans Asp.NET tout en stockant un seul numéro 64 bits pour tenir une combinaison quelconque de sélections. Et vous n'avez pas besoin d'un opérateur de comparaison non indexable dans vos procédures clauses where, sauf contre la table ENUM lui-même qui a un maximum de 64 lignes. Recherche vos distributeurs pour tous ceux qui navires à l'Indiana et la Californie peuvent toujours utiliser une comparaison d'égalité et un index.

Maintenant, vous avez une demande d'ajouter le support pour les territoires américains, les forces armées et de diffusion des codes provinces canadiennes, et le faire d'une manière rétrocompatible. Il n'y a pas de coupe 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?

Réponses créatives sont appréciés, mais le vrai défi est ici la suivante: Y at-il un moyen de forcer les mêmes mathématiques au niveau du bit qui fonctionne sur des valeurs non signés 64 bits pour travailler sur les signés en utilisant l'espace négatif pour dépasser 64 bits possibles, en C # et SQL (2008)? S'il importe, le drapeau est simulé, pas un drapeau « réel », il est donc techniquement pas nécessaire pour que cela fonctionne contre un ENUM CLR avec l'attribut [Flags].

Était-ce utile?

La solution

Vous ne pouvez pas dépasser 64 bits sur une valeur 64 bits, même en utilisant le « espace négatif ». Si vous avez 64 bits, vous avez 64 bits. Vous pouvez utiliser un Guid pour obtenir 128 bits, ce qui mettra le problème pendant un certain temps, mais en fin de compte, vous devrez ajouter des champs supplémentaires.

Autres conseils

Dans SQL Server, vous pouvez essayer décimal (38,0)

Cela vous donne 38 chiffres à gauche du point décimal (1E38). En termes binaires, il est environ 126 morceaux (8.5E37). Et il peut être manipulé comme un numéro.

Cependant, une option serait de définir ce que vous voulez dans .NET et utiliser une correspondance CLR type de données dans SQL Server. De cette façon, il peut être cohérent entre les 2 plates-formes.

Cependant, je voudrais vraiment envisager de changer loin de drapeaux ...

Mon 2c: Vous essayez d'être intelligent, et votre cause de votre propre douleur. Bitfields et SQL ne se mélangent pas bien, surtout parce bitfields ne peuvent pas être correctement indexé et toute recherche devront faire une analyse complète. Par exemple. pour trouver tous reselers ce navire vous AK devez analyser la table complète de reselers. Aussi la solution n'échelle pas plus de 64 valeurs (comme vous avez déjà découvert). Il choix de stockage aussi pauvres, il faut un peu avec la valeur 0 pour stocker les informations négatives (manque d'association).

Utilisez un tableau distinct pour modéliser les nombreux à plusieurs rapports entre les revendeurs et les États / territoires / provinces / pays où ils embarquent à.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top