C# 不需要对分销商表进行表扫描。对64行max States表进行一次扫描,以构建索引@StateIDs表变量,该变量包含所有按位比较的输出。(这项工作实际上也可以持久化,但目前还没有足够的资源密集型。)。CLR数据类型的想法很有趣;我将研究是否可以使用该角度

C# 不需要对分销商表进行表扫描。对64行max States表进行一次扫描,以构建索引@StateIDs表变量,该变量包含所有按位比较的输出。(这项工作实际上也可以持久化,但目前还没有足够的资源密集型。)。CLR数据类型的想法很有趣;我将研究是否可以使用该角度,c#,sql,bit-manipulation,flags,C#,Sql,Bit Manipulation,Flags,不需要对分销商表进行表扫描。对64行max States表进行一次扫描,以构建索引@StateIDs表变量,该变量包含所有按位比较的输出。(这项工作实际上也可以持久化,但目前还没有足够的资源密集型。)。CLR数据类型的想法很有趣;我将研究是否可以使用该角度提取>64位标志。就改变标志而言,我通常只在我希望存在十几个或更少可能值的地方使用它们,并且没有其他理由创建多对多关系。我还有一个工具,可以在SQL端自动生成可索引查询,并在.NET端为它们包含运算符,但我将它们的使用限制在可能节省空间和编码时


不需要对分销商表进行表扫描。对64行max States表进行一次扫描,以构建索引@StateIDs表变量,该变量包含所有按位比较的输出。(这项工作实际上也可以持久化,但目前还没有足够的资源密集型。)。CLR数据类型的想法很有趣;我将研究是否可以使用该角度提取>64位标志。就改变标志而言,我通常只在我希望存在十几个或更少可能值的地方使用它们,并且没有其他理由创建多对多关系。我还有一个工具,可以在SQL端自动生成可索引查询,并在.NET端为它们包含运算符,但我将它们的使用限制在可能节省空间和编码时间的实例中。不幸的是,十进制类型对于位运算符无效。CLR数据类型的想法很有趣;我将研究是否可以使用该角度提取>64位标志。就改变标志而言,我通常只在我希望存在十几个或更少可能值的地方使用它们,并且没有其他理由创建多对多关系。我还有一个工具,可以在SQL端自动生成可索引查询,并在.NET端为它们包含运算符,但我将它们的使用限制在可能节省空间和编码时间的实例上。
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