Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Suivi des champs modifiés sans conserver l'historique

Comment utiliser un champ de bits dans TSQL (pour les mises à jour et les lectures)

Définissez le champ de bits par défaut sur 0 au démarrage (ce qui signifie aucun changement), vous devez utiliser le type int pour jusqu'à 32 bits de données et bigint pour jusqu'à 64 bits de données.

Pour définir un bit dans un champ de bit, utilisez le | (opérateur bit OR) dans l'instruction de mise à jour, par exemple

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

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

etc pour chaque champ utiliser le 2 à la puissance de N-1 pour la valeur après le |

Pour lire un champ de bits, utilisez & (bit ET opérateur) et voir si c'est vrai, par exemple

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

note que je n'utiliserais probablement pas de texte car cela sera utilisé par une application, quelque chose comme ça fonctionnera

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

ou vous pouvez utiliser !=0 ci-dessus pour le rendre simple comme je l'ai fait dans mon test ci-dessous

Doivent réellement tester pour ne pas avoir d'erreurs, cliquez pour le script de test

réponse originale :

Si vous avez moins de 16 colonnes dans votre table, vous pouvez stocker les "indicateurs" sous forme d'entier, puis utiliser la méthode des indicateurs binaires pour indiquer les colonnes qui ont changé. Ignorez simplement ou ne vous embêtez pas à marquer ceux qui ne vous intéressent pas.

Ainsi, si flagfield BOOLEAN AND 2^N est vrai, cela indique que le Nième champ a changé.

Ou un exemple pour max de N =2

0 - rien n'a changé (tous les bits à 0)

1 - champ 1 modifié (premier bit 1)

2 - champ 2 modifié (deuxième bit 1)

3 - champ 1+2 modifié (premier et deuxième bit 1)

voir ce lien pour une meilleure définition :http://en.wikipedia.org/wiki/Bit_field