Een bitveld gebruiken in TSQL (voor updates en reads)
Stel het bitveld standaard in op 0 bij het begin (wat betekent dat er geen wijzigingen zijn). Gebruik type int voor maximaal 32 bits gegevens en bigint voor maximaal 64 bits gegevens.
Gebruik de |
. om een bit in een bitveld in te stellen (bit OR-operator) in de update-instructie, bijvoorbeeld
UPDATE table
SET field1 = 'new value', bitfield = bitfield | 1
UPDATE table
SET field2 = 'new value', bitfield = bitfield | 2
enz. gebruik voor elk veld de 2 tot macht van N-1 voor de waarde na de |
Gebruik &
. om een bitveld te lezen (bit AND-operator) en kijk of het waar is, bijvoorbeeld
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
opmerking Ik zou waarschijnlijk geen tekst gebruiken, aangezien dit door een toepassing zal worden gebruikt, zoiets als dit zal werken
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
of je kunt !=0 hierboven gebruiken om het eenvoudig te maken, zoals ik deed in mijn test hieronder
Echt moeten testen om geen fouten te hebben, klik voor het testscript
origineel antwoord:
Als u minder dan 16 kolommen in uw tabel heeft, kunt u de "vlaggen" opslaan als een geheel getal en vervolgens de bitvlagmethode gebruiken om de kolommen aan te geven die zijn gewijzigd. Negeer of markeer degenen die u niet interesseren.
Dus als vlaggenveld BOOLEAN AND 2^N waar is, geeft dit aan dat het N-de veld is gewijzigd.
Of een voorbeeld voor max van N =2
0 - er is niets veranderd (alle bits 0)
1 - veld 1 gewijzigd (eerste bit 1)
2 - veld 2 gewijzigd (tweede bit 1)
3 - veld 1+2 gewijzigd (eerste en tweede bit 1)
zie deze link voor een betere definitie:http://en.wikipedia.org/wiki/Bit_field