Hur man använder ett bitfält i TSQL (för uppdateringar och läsningar)
Ställ in bitfältet som standard till 0 vid start (vilket betyder inga ändringar) du bör använda typ int för upp till 32 bitar data och bigint för upp till 64 bitar data.
För att ställa in en bit i ett bitfält använd |
(bit OR-operator) i uppdateringssatsen, till exempel
UPDATE table
SET field1 = 'new value', bitfield = bitfield | 1
UPDATE table
SET field2 = 'new value', bitfield = bitfield | 2
etc för varje fält använd 2 till potens av N-1 för värdet efter |
För att läsa ett bitfält använd &
(bit OCH operator) och se om det är sant, till exempel
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
notera att jag förmodligen inte skulle använda text eftersom detta kommer att användas av en applikation, något sånt här kommer att fungera
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
eller så kan du använda !=0 ovan för att göra det enkelt som jag gjorde i mitt test nedan
originalsvar:
Om du har mindre än 16 kolumner i din tabell kan du lagra "flaggorna" som ett heltal och sedan använda bitflaggametoden för att indikera kolumnerna som ändrades. Bara ignorera eller bry dig inte om att markera de som du inte bryr dig om.
Så om flaggfältet BOOLEAN AND 2^N är sant indikerar det att det N:te fältet ändrats.
Eller ett exempel på max N =2
0 - ingenting har ändrats (alla bitar 0)
1 - fält 1 ändrat (första bit 1)
2 - fält 2 ändrat (andra bit 1)
3 - fält 1+2 ändrats (första och andra bit 1)
se denna länk för en bättre definition:http://en.wikipedia.org/wiki/Bit_field