资源描述:
《sql位运算(包括权限的操作)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、SQL位运算在SQLServer,采用1,2,4,8,16.....等用数字标识的状态字段可以进行累加,对存在的几种状态进行组合,从而可形成各种组合状态例如:一条记录该字段原来的数字是,2,如我们想加上4,则可以用updatet_UsersetiFlag=iFlag
2、4whereUserID=1(iFlag为该字段名)例2:在加上4之后我们想去掉4怎么办呢,可以这样实现updatet_UsersetiFlag=iFlag^4whereUserID=1这样就又把4从该记录中去掉了.如果我们想选择所有为2的记录该怎么做
3、呢,可以这样实现select*fromt_UserwhereiFlag&2=2SQL中的位运算不但可以取出各种值,而且我们可以对他对数据进行排序举例如下,新闻列表中的一个字段标识为1:置顶2:不置顶4:推荐8:不推荐该字段的值可以为这4种状态的组合,如果我们根据一定条件想把所有置顶的放在前面该如何做呢select*fromt_NewsorderbyiFlag&1desc这样我们就把所有置顶的贴子排在前面,当然这里可以加上一定的Where条件,在Where里也可可以加一定的位运算,关于位运算可以查阅相应的SQL帮助下
4、面来讲一讲C#中的枚举位运算这里我们定义一个枚举 [Flags] enumUserFlag { a=1, b=2, c=4, d=8, e=16, f=32 }在代码里加上如下处理 protectedvoidPage_Load(objectsender,EventArgse) { if(!IsPostBack) { 这是第一种写法: stringstrSQL="select*
5、fromv_UserwhereiFlag&@iFlag=@iFlag"; 这是第二种写法: stringstrSQL="select*fromv_Userwhere @iFlag
6、iFlag=iFlag //SqlParameterparm=newSqlParameter("@iFlag",SqlDbType.Int,4); //parm.Value=UserFlag.a
7、UserFlag.b; SqlConnectioncon=newS
8、qlConnection("server=.;database=Sinvan_TexDB;UserId=sa;pwd=123;"); SqlCommandcomm=newSqlCommand(strSQL,con); comm.Parameters.Add("@iFlag",SqlDbType.Int,4).Value=UserFlag.a
9、UserFlag.b; SqlDataAdapteradp=newSqlDataAdapter(comm);
10、 DataTabledTable=newDataTable(); adp.Fill(dTable); UserFlaguserFlag=(UserFlag)Enum.Parse(typeof(UserFlag),dTable.Rows[0][11].ToString()); } }进行处理之后userFlag就是数据库中存在的各种组合我们同样可对其进行一定的位运算处理如我们想加上UserFlag.c可进行如下操作userFlag=userFlag
11、
12、Userflag.c如想去掉UserFlag.c可进行如下操作userFlag=userFlag^UserFlag.c如我们要判断是该标识中是否存在c可进行如下操作(userFlag&UserFlag.c)==UserFlag.c是不是与SQLServer中的操作类似,位运算不管什么语言都是通用的,呵呵可惜Access不支持位运算 select2
13、8 --10 select2
14、8
15、1 --11select10&8 --8,包含,10=8+2 select10&2 --2,包含,10=2+8
16、 select10&4 --0,不包含 select19&16 --16,包含,19=16+2+1 select19&8 --0,包含,19=16+2+1select*fromSqlBitOperationwhereFBitTags&4=4 在权限中的应用1、两张表(1)、操作与权限标志表ifexists(select*fromsysobjectsw