Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Geänderte Felder nachverfolgen, ohne den Verlauf zu pflegen

Wie man ein Bitfeld in TSQL verwendet (für Aktualisierungen und Lesevorgänge)

Setzen Sie das Bitfeld beim Start standardmäßig auf 0 (dh keine Änderungen). Sie sollten den Typ int für bis zu 32 Datenbits und bigint für bis zu 64 Datenbits verwenden.

Um ein Bit in einem Bitfeld zu setzen, verwenden Sie den | (Bit-ODER-Operator) in der Update-Anweisung, zum Beispiel

UPDATE table 
SET field1 = 'new value', bitfield = bitfield | 1

UPDATE table 
SET field2 = 'new value', bitfield = bitfield | 2

usw. Verwenden Sie für jedes Feld die 2 hoch N-1 für den Wert nach dem |

Um ein Bitfeld zu lesen, verwenden Sie & (Bit-UND-Operator) und sehen, ob es wahr ist, zum Beispiel

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

Hinweis Ich würde wahrscheinlich keinen Text verwenden, da dies von einer Anwendung verwendet wird, so etwas wird funktionieren

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

oder Sie können !=0 oben verwenden, um es einfach zu machen, wie ich es in meinem Test unten getan habe

Müssen tatsächlich testen, um keine Fehler zu haben, klicken Sie für das Testskript

ursprüngliche Antwort:

Wenn Sie weniger als 16 Spalten in Ihrer Tabelle haben, können Sie die "Flags" als ganze Zahl speichern und dann die Bit-Flag-Methode verwenden, um die geänderten Spalten anzuzeigen. Ignorieren Sie einfach diejenigen, die Sie nicht interessieren, oder markieren Sie sie nicht.

Wenn also Flagfield BOOLEAN AND 2^N wahr ist, zeigt dies an, dass sich das N-te Feld geändert hat.

Oder ein Beispiel für max. N =2

0 - nichts hat sich geändert (alle Bits 0)

1 - Feld 1 geändert (erstes Bit 1)

2 - Feld 2 geändert (zweites Bit 1)

3 - Feld 1+2 geändert (erstes und zweites Bit 1)

siehe diesen Link für eine bessere Definition:http://en.wikipedia.org/wiki/Bit_field