Как да използвате битово поле в TSQL (за актуализации и четения)
Задайте битовото поле по подразбиране на 0 в началото (което означава, че няма промени), трябва да използвате тип int за до 32 бита данни и bigint за до 64 бита данни.
За да зададете бит в битово поле, използвайте |
(битов оператор ИЛИ) в израза за актуализиране, например
UPDATE table
SET field1 = 'new value', bitfield = bitfield | 1
UPDATE table
SET field2 = 'new value', bitfield = bitfield | 2
и т.н. за всяко поле използвайте 2 на степен N-1 за стойността след |
За да прочетете малко поле, използвайте &
(оператор bit AND) и вижте дали е вярно, например
SELECT field1, field2,
CASE WHEN (bitfield & 1) = 1 THEN 'field1 mod' ELSE 'field1 same' END,
CASE WHEN (bitfield & 2) = 2 THEN 'field2 mod' ELSE 'field2 same' END
FROM table
забележете, че вероятно няма да използвам текст, тъй като това ще се използва от приложение, нещо подобно ще работи
SELECT field1, field2,
CASE WHEN (bitfield & 1) = 1 THEN 1 ELSE 0 END AS [field1flag],
CASE WHEN (bitfield & 2) = 2 THEN 1 ELSE 0 END AS [field2flag]
FROM table
или можете да използвате !=0 по-горе, за да го опростите, както направих в моя тест по-долу
Трябва действително да тествам, за да няма грешки, щракнете за тестовия скрипт
оригинален отговор:
Ако имате по-малко от 16 колони във вашата таблица, можете да съхраните "флаговете" като цяло число, след което да използвате метода на битов флаг, за да посочите колоните, които са се променили. Просто игнорирайте или не си правете труда да маркирате тези, които не ви интересуват.
Следователно, ако флаговото поле BOOLEAN AND 2^N е вярно, това показва, че N-тото поле е променено.
Или пример за max от N =2
0 - нищо не се е променило (всички битове 0)
1 - поле 1 е променено (първи бит 1)
2 - поле 2 е променено (втори бит 1)
3 - поле 1+2 променено (първи и втори бит 1)
вижте тази връзка за по-добро определение:http://en.wikipedia.org/wiki/Bit_field