使用64位有符号值在SQL和C#中模拟128位无符号整数?

Pau*_*ith 1 c# sql flags bit-manipulation

采用这种情况:您在C#中绑定了一些标记枚举(并且实际上是从SQL Server中的Enum-ish表生成).假设您是经销商,并允许您的经销商指定他们发货的美国州.作为一名出色而优雅的软件工程师,您将这些作为可按位组合的标志值实现以节省存储:

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
Run Code Online (Sandbox Code Playgroud)

甜.您可以包括/使用逐逻辑,它可以让你瞬间滋润复选框列表和Asp.NET选择列表中,同时仍然只存储一个64位数字,以保持选择的任何组合SQL和C#动态排除.并且在过程的WHERE子句中不需要非可索引的比较运算符,除了最多包含64行的枚举表本身.在经销商处搜索运往印第安纳州和加利福尼亚州的所有人仍然可以使用相等比较和索引.

现在您要求增加对美国领土,武装部队邮政编码和加拿大各省的支持,并以向后兼容的方式进行.没有将名单减少到<64个条目,并且企业确实希望避免将老派国家与其他地区和部门隔离开来.

你是做什么?

创意的答案是值得赞赏的,但这里真正的挑战是这样的:有没有办法迫使同样按位数学,关于无符号64位值工程上签字的人工作,而使用负空间超过64个可能的位,在C#和SQL(2008)?如果重要,则模拟标志,而不是"真实"标志,因此从技术上讲,不需要使用[Flags]属性来对抗CLR枚举.

Dav*_*ler 5

64位值不能超过64位,甚至不能使用"负空间".如果你有64位,你有64位.您可以使用Guid获取128位,这会将问题暂时解决,但最终您需要添加其他字段.