7 sql bit-manipulation sql-server-2008
我需要有关如何处理SQL2k8表中相对较大的标志集的建议.
两个问题,请跟我说:)
假设我有20个标志,我想存储一个记录.
例如:
CanRead = 0x1 CanWrite = 0x2 CanModify = 0x4 ......依此类推到最后的标志2 ^ 20
现在,如果我设置一个记录的以下组合:Permissions = CanRead | CanWrite
我可以通过执行WHERE(权限和CanRead)= CanRead来轻松检查该记录是否具有所需权限
这样可行.
但是,我还想检索所有可以写或修改的记录.
如果我发出WHERE(权限和(CanWrite | CanModify))=(CanWrite | CanModify)我显然不会得到我的权限设置为CanRead的记录 CanWrite
换句话说,我怎样才能找到与我发送给程序的面具中的任何标志相匹配的记录?
第二个问题,SQL 2008中的性能如何?创建20位字段实际上会更好吗?
谢谢你的帮助
G M*_*ros 12
我假设您的Permissions列是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
Run Code Online (Sandbox Code Playgroud)
当您使用逻辑和时,您将根据您的条件得到一个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
Run Code Online (Sandbox Code Playgroud)
现在,假设您要测试"读取"或"修改".从您的应用程序,您将传入(CanRead | CanModify).这将是101(二进制).
首先,让我们对ONLY已经读过的表中的一行进行测试.
001 (Row from table)
& 101 (Permissions to test)
------
001 (result is greater than 0)
Run Code Online (Sandbox Code Playgroud)
现在,让我们测试一下只有Write的行.
010 (Row from table)
& 101 (Permission to test)
------
000 (result = 0)
Run Code Online (Sandbox Code Playgroud)
现在对具有所有3个权限的行进行测试.
111 (Row from table)
& 101 (Permission to test)
------
101 (result is greater than 0)
Run Code Online (Sandbox Code Playgroud)
我希望您可以看到,如果AND操作的结果导致值= 0,则所有测试的权限都不适用于该行.如果该值大于0,则至少存在一行.
VVS*_*VVS 11
不要那样.这就像将CSV字符串保存到备忘录字段中并破坏了数据库的目的.
对每个标志使用布尔(位)值.在这个特定的示例中,您可以找到可以读取并可以编写或修改的所有内容:
WHERE CanRead AND (CanWrite OR CanModify)
Run Code Online (Sandbox Code Playgroud)
简单的纯SQL,没有聪明的黑客.额外的7位你浪费的每一面旗帜都不值得头疼.
关于什么
WHERE (Permissions & CanWrite) = CanWrite
OR (Permissions & CanModify) = CanModify
Run Code Online (Sandbox Code Playgroud)
?
归档时间: |
|
查看次数: |
4020 次 |
最近记录: |