SQLSERVER---- 通过位运算更改标志位

  当给多个中心传输数据时,怎么标记哪些单位推送了,哪些单位没有更新,如果单独设置一个字段,一来说,扩展不足,另外会造成数据库冗余,这里可以采用SQLSERVER的位运算。

比如说,更新标志位为0,长度为4位,对应的二进制为0000,0001表示给高德更新数据,0010表示给百度更新数据,这样做,就不会相互影响更新标记位了。具体怎么做?

这里采用数据库的或运算(|),具体的如下:

1,获取所有没有给高德推送的数据

  思路:没有给高德更新的数据的标志位的二进制为 xxx0,怎么获取这些数据呢?可以让最后一位与0001进行或运算,因为1|1 = 1 , 0|1 = 1,如果或运算的结果和原来的值不一样,则表示这个数据没有给高德推送过,反之,表示推送过。根据这个理论,采用下面来获取:

select * from test a where (a.id|1) != a.id

  这样,获取的就是没有给高德推送的数据,也就是二进制格式为xxx0的数据。

2,更新高德推送的数据

  思路:更新高德的数据就是将数据标志为设置为xxx1,那么怎么设置呢?为了不对其他的数据造成影响,这里非修改位采用与0进行或运算,修改位采用与1进行或运算,因为0|0=0,0|1=1,0进行或运算不会修改数据,1|0=1,1|1=1,1进行或运算,会将该位设置为1,所以,可以采用下面进行更新

update test

         set id = id|1

         where name = 'test0'

参考 http://blog.csdn.net/u012346225/article/details/38534293

原文地址:https://www.cnblogs.com/ningheshutong/p/8302617.html