Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Tenere traccia dei campi modificati senza mantenere la cronologia

Come utilizzare un campo di bit in TSQL (per aggiornamenti e letture)

Imposta il campo bit su 0 all'inizio (che significa nessuna modifica) dovresti usare type int per un massimo di 32 bit di dati e bigint per un massimo di 64 bit di dati.

Per impostare un bit in un campo bit usa il | (operatore bit OR) nell'istruzione di aggiornamento, ad esempio

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

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

ecc. per ogni campo usa il 2 alla potenza di N-1 per il valore dopo il |

Per leggere un campo di bit usa & (operatore bit AND) e verifica se è vero, ad esempio

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

nota che probabilmente non userei il testo poiché verrà utilizzato da un'applicazione, qualcosa del genere funzionerà

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

oppure puoi usare !=0 sopra per renderlo semplice come ho fatto nel mio test qui sotto

Devi eseguire effettivamente il test per non avere errori, fai clic per lo script di test

risposta originale:

Se hai meno di 16 colonne nella tua tabella, puoi memorizzare i "flags" come un numero intero, quindi utilizzare il metodo bit flag per indicare le colonne che sono cambiate. Ignora o non preoccuparti di contrassegnare quelli che non ti interessano.

Pertanto, se flagfield BOOLEAN AND 2^N è vero, indica che l'ennesimo campo è cambiato.

Oppure un esempio per max di N =2

0 - non è cambiato nulla (tutti i bit 0)

1 - campo 1 modificato (primo bit 1)

2 - campo 2 modificato (secondo bit 1)

3 - campo 1+2 modificato (primo e secondo bit 1)

vedere questo collegamento per una definizione migliore:http://en.wikipedia.org/wiki/Bit_field