如何处理SQL记录的很多标志

我需要有关如何处理sql2k8表中相对较大的标志集的建议.

两个问题,请跟我说:)

假设我有20个标志,我想存储一个记录.

例如:

CanRead = 0x1
CanWrite = 0x2
CanModify = 0x4

等到最后的旗帜2 ^ 20

现在,如果我设置以下一个记录的组合:Permissions = CanRead | CanWrite

我可以通过WHERE(Permissions& CanRead)= CanRead轻松检查该记录是否具有所需权限

这样可行.

但是,我还想检索所有可以写或修改的记录.

如果我发出WHERE(权限&(CanWrite | CanModify))=(CanWrite | CanModify)我显然不会得到我的权限设置为CanRead的记录CanWrite

换句话说,我怎样才能找到与我发送给程序的面具中的任何标志相匹配的记录?

第二个问题,sql 2008中的性能如何?创建20位字段实际上会更好吗?

谢谢你的帮助

解决方法

我假设你的权限列是一个Int.如果是,我鼓励您使用我在下面提供的示例代码.这应该可以清楚地表明功能的工作原理.
Declare @Temp Table(Permission Int,PermissionType VarChar(20))

Declare @CanRead Int
Declare @CanWrite Int
Declare @CanModify Int

Select @CanRead = 1,@CanWrite = 2,@CanModify = 4

Insert Into @Temp Values(@CanRead | @CanWrite,'Read,write')
Insert Into @Temp Values(@CanRead,'Read')
Insert Into @Temp Values(@CanWrite,'Write')
Insert Into @Temp Values(@CanModify | @CanWrite,'Modify,write')
Insert Into @Temp Values(@CanModify,'Modify')

Select * 
From   @Temp 
Where  Permission & (@CanRead | @CanWrite) > 0

Select * 
From   @Temp 
Where  Permission & (@CanRead | @CanModify) > 0

当您使用逻辑和时,您将根据您的条件得到一个1的数字.如果没有匹配,则结果将为0.如果一个或多个条件匹配,则结果将大于0.

让我举个例子.

假设CanRead = 1,CanWrite = 2,CanModify = 4.有效组合为:

Modify Write Read Permissions
------ ----- ---- -----------
  0       0    0   nothing
  0       0    1   Read
  0       1    0   Write
  0       1    1   Read,Write
  1       0    0   Modify
  1       0    1   Modify,Read
  1       1    0   Modify,Write
  1       1    1   Modify,Write,Read

现在,假设您要测试“读取”或“修改”.从您的应用程序,您将传入(CanRead | CanModify).这将是101(二进制).

首先,让我们对ONLY已经读过的表中的一行进行测试.

001 (Row from table)
&  101 (Permissions to test)
------
   001 (result is greater than 0)

现在,让我们测试一个只有Write的行.

010 (Row from table)
&  101 (Permission to test)
------
   000 (result = 0)

现在对具有所有3个权限的行进行测试.

111 (Row from table)
&  101 (Permission to test)
------
   101 (result is greater than 0)

我希望您可以看到,如果AND操作的结果导致值= 0,则所有测试的权限都不适用于该行.如果该值大于0,则至少存在一行.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...