sql >> Database >  >> RDS >> Sqlserver

Gewijzigde velden bijhouden zonder de geschiedenis bij te houden

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



  1. Update tussen 2 databases met dblink werkt niet

  2. Wachtwoord versleutelen/ontsleutelen in Oracle Function

  3. Bewaar alle gegevenswijzigingen met alle details (zoals Stackoverflow)

  4. Hoe de inloggegevens van de gebruiker in Android te valideren met behulp van PHP, MySql met behulp van json