如何处理SQL记录的很多标志
我需要有关如何处理SQL2k8表中相对较大的标志集的建议.
两个问题,请跟我说:) 假设我有20个标志,我想存储一个记录. 例如: CanRead = 0x1 现在,如果我设置以下一个记录的组合: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,则至少存在一行. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |